如何使用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
。
答案 0 :(得分:5)
不要破坏超类:传递消息
在覆盖系统消息的过程中,如becomeFirstResponder
,您可能会无意中禁用父类。最安全,没有操作becomeFirstResponder
就是这样:
override func becomeFirstResponder() -> Bool {
return super.becomeFirstResponder()
}
省略super.becomeFirstResponder()
会损害UITextField
。
同样让原始逻辑(何时成为或不成为响应者)采取其行动。始终响应true
或false
会更改父类的行为,这可能会产生不必要的和不幸的副作用。
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()
未成功,请注意不采取行动。
<强>演示强>
►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。