调用resignFirstResponder并不能在覆盖firstResponder

时间:2016-01-25 04:57:36

标签: ios swift uitextfield uiresponder

如何使用UIResponder关注激活的UITextField?

以下代码:

//  customTextField.swift
import UIKit
class customTextField: UITextField {

override func becomeFirstResponder() -> Bool {
    if self.tag == 1 {
        self.borderStyle = .Line
        self.superview?.viewWithTag(2)?.resignFirstResponder()
        self.superview?.viewWithTag(3)?.resignFirstResponder()
    } else if self.tag == 2 {
        self.borderStyle = .Line
        self.superview?.viewWithTag(1)?.resignFirstResponder()
        self.superview?.viewWithTag(3)?.resignFirstResponder()            
    } else {
        self.borderStyle = .Line
        self.superview?.viewWithTag(1)?.resignFirstResponder()
        self.superview?.viewWithTag(2)?.resignFirstResponder()
    }
    return true
}
override func resignFirstResponder() -> Bool {
    print("This is called")
    self.borderStyle = .None
    super.resignFirstResponder()
    return true
}}

我想通过View标签检查哪个textfield是firstResponder。然后,如果其他TextField应该由resignFirstResponder未聚焦。

但是,当我触摸视图中的textField时,甚至不会调用becomefirstResponder代码块中的resignFirstResponder

1 个答案:

答案 0 :(得分:5)

不要破坏超类:传递消息

在覆盖系统消息的过程中,如becomeFirstResponder,您可能会无意中禁用父类。最安全,没有操作becomeFirstResponder就是这样:

override func becomeFirstResponder() -> Bool {
    return super.becomeFirstResponder()
}

省略super.becomeFirstResponder()会损害UITextField

同样让原始逻辑(何时成为或不成为响应者)采取其行动。始终响应truefalse会更改父类的行为,这可能会产生不必要的和不幸的副作用。

    override func becomeFirstResponder() -> Bool {
        let becomeFirstResponder = super.becomeFirstResponder()
        // Do stuff
        return becomeFirstResponder
    }

不要复制操作系统

无需跟踪当前的响应者 让你的操作系统消息是响应者:尝试进行跟踪,否则当屏幕键盘被解除而没有点击新字段时,实际上可能无法工作,并且必然会中断。相反,请以同样的方式收听resignFirstResponder

override func resignFirstResponder() -> Bool {
    return super.resignFirstResponder()
}

代码更少,灵活性更高

将两条规则放在一起,然后使用.RoundedRect& .Line显式重绘(.None无效),您的整个CustomTextField可能如此:

class CustomTextField: UITextField {

    override func becomeFirstResponder() -> Bool {
        let becomeFirstResponder = super.becomeFirstResponder()
        if becomeFirstResponder {
            self.borderStyle = .line
        }
        return becomeFirstResponder
    }

    override func resignFirstResponder() -> Bool {
        let resignFirstResponder = super.resignFirstResponder()
        if resignFirstResponder {
            self.borderStyle = .roundedRect
        }
        return resignFirstResponder
    }
}

如果super.becomeFirstResponder()super.resignFirstResponder()未成功,请注意不采取行动

<强>演示

Animation

►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。