如何快速确定哪个文本字段处于活动状态

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 上哪个安全管理器处于活动状态?

如何在颤动中取消焦点文本字段?

引导手风琴如何检查哪个面板处于活动状态

如何确定当前视图控制器是不是处于活动状态,如果处于活动状态则执行代码

如何确定夏令时是不是在 C 中处于活动状态?

如何确定 Skype 通话当前是不是在 Android 上处于活动状态