如何快速确定哪个文本字段处于活动状态
Posted
技术标签:
【中文标题】如何快速确定哪个文本字段处于活动状态【英文标题】:How to determine which textfield is active swift 【发布时间】:2015-06-18 14:49:41 【问题描述】:我不知道哪个UITextField
当前处于活动状态,因此如果他们在UIBarButtonItem
上点击取消,我可以清除其文本。这是我的代码。有一个带有UIPickerView
,UIToolBar
和两个条形按钮项的视图。取消项目有一个动作会清除其文本,但我不知道如何获得正确的UITextField
。
这两个我都试过了:
@IBAction func cancelText(sender: AnyObject)
if self.truckYear.editing == true
println("truckYear")
clearText(self.truckYear)
else if self.truckMake.editing == true
clearText(self.truckMake)
@IBAction func doneText(sender: AnyObject)
pickerView.hidden = true
func clearText(textField:UITextField)
println("in clear text")
textField.text = nil
还有:
@IBAction func cancelText(sender: AnyObject)
if self.truckYear.isFirstResponder()
println("truckYear")
clearText(self.truckYear)
else if self.truckMake.isFirstResponder()
clearText(self.truckMake)
@IBAction func doneText(sender: AnyObject)
pickerView.hidden = true
func clearText(textField:UITextField)
println("in clear text")
textField.text = nil
【问题讨论】:
【参考方案1】:您可以在您的类中声明一个UITextField
属性,并在textFieldDidBeginEditing
中将当前文本字段分配给它。
然后,您可以在需要时调用此文本字段。
class ViewController : UIViewController, UITextFieldDelegate
var activeTextField = UITextField()
// Assign the newly active text field to your activeTextField variable
func textFieldDidBeginEditing(textField: UITextField)
self.activeTextField = textField
// Call activeTextField whenever you need to
func anotherMethod()
// self.activeTextField.text is an optional, we safely unwrap it here
if let activeTextFieldText = self.activeTextField.text
print("Active text field's text: \(activeTextFieldText)")
return;
print("Active text field is empty")
【讨论】:
那么我可以使用它,然后在 UIBarButtonItem 操作中只说 clearText(self.activeTextField) 吗? 是的,你可以这样做。 好的,我刚试了一下,没有错误,但文本没有设置为空。这是我的代码,` func textFieldDidBeginEditing(textField: UITextField) self.activeTextfield = textField @IBAction func cancelText(sender: AnyObject) println("action failed") self.activeTextfield.text = nil self.pickerView.hidden = true @IBAction func doneText(sender: AnyObject) pickerView.hidden = true ` 在您的cancelText(...)
方法中,您可以在尝试清除之前添加NSLog("text in activeTextField : %@", self.activeTextField.text)
吗?它应该向您显示此文本字段的内容。另外,尝试像这样清除您的文本:self.activeTextfield.text = ""
我想通了,感谢您的帮助。所以来发现我已经在进一步使用 didBeginEditing,(我知道我是菜鸟),然后你的代码工作得很好。谢谢!【参考方案2】:
在 Swift 4 中:
你可以像这样获得活跃的 UITextField
extension UIView
func getSelectedTextField() -> UITextField?
let totalTextFields = getTextFieldsInView(view: self)
for textField in totalTextFields
if textField.isFirstResponder
return textField
return nil
func getTextFieldsInView(view: UIView) -> [UITextField]
var totalTextFields = [UITextField]()
for subview in view.subviews as [UIView]
if let textField = subview as? UITextField
totalTextFields += [textField]
else
totalTextFields += getTextFieldsInView(view: subview)
return totalTextFields
然后你就这样称呼它
let current = view.getSelectedTextField()
【讨论】:
【参考方案3】:为了改进@Reimond 的回答Swift 4
extension UIView
var textFieldsInView: [UITextField]
return subviews
.filter ( !($0 is UITextField) )
.reduce (( subviews.compactMap $0 as? UITextField ), summ, current in
return summ + current.textFieldsInView
)
var selectedTextField: UITextField?
return textFieldsInView.filter $0.isFirstResponder .first
用法:
view.selectedTextField
【讨论】:
【参考方案4】:您可以为所有文本字段分配一个标签,并在 textFieldDidBeginEditing 检查您当前的 textFeild.tag,很明显,女巫 textfeild 正在使用中。
【讨论】:
请考虑编写可以完成这项工作的代码,而不是随机描述如何编写它。谢谢。【参考方案5】:使用委托:
optional func textFieldDidEndEditing(_ textField: UITextField)
这将告诉您活动文本字段何时完成编辑,textField
将包含一个指针,指向不再活动的文本字段。
【讨论】:
你能举个例子说明如何在那个动作中实现它吗? 我真的建议学习如何实现委托方法。如果您没有弄清楚这一点,那么 Cocoa API 将有无穷无尽的麻烦。 我实现了一些委托方法,但我对 swift 还很陌生,所以我没有拼图的所有部分,但我会试一试。【参考方案6】:/// Finds the textField that is the first responder in a view hierarchy
func findActiveTextField(in subviews: [UIView], textField: inout UITextField?)
guard textField == nil else return
for view in subviews
if let tf = view as? UITextField, view.isFirstResponder
textField = tf
break
else if !view.subviews.isEmpty
findActiveTextField(in: view.subviews, textField: &textField)
// Usage
var aView: UIView = UIView()
var activeField : UITextField?
findActiveTextField(in: aView.subviews, textField: &activeField)
【讨论】:
Use of unresolved identifier 'activeField'
请解决这个问题【参考方案7】:
我写了一个库来处理基本的表单创建Swift Pop Form。
它不使用tags
,而是设置一个包含字段的数据源并使用indexPathForCell
来查询哪个是活动文本字段。查看源代码了解更多!
【讨论】:
以上是关于如何快速确定哪个文本字段处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 确定在 z/OS 上哪个安全管理器处于活动状态?