为简单起见,假设我想创建一个自定义UITextField
,我想为它添加一个简单的行为;也就是说,如果文本字段成为第一个响应者,背景颜色将变为绿色。
为此,在我的自定义类中,我必须将类设置为委托,以接收成为第一响应者的事件。但问题是,如果此自定义文本字段的用户将自己设置为委托,则事件不会发送到自定义文本字段(因为只有一个对象可以是另一个对象的委托)
我可以手动转发所有事件,但我正在寻找更清晰,更具伸缩性的解决方案。
以下是情况草图:
class MyTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
delegate = self
}
}
extension MyTextField: UITextFieldDelegate {
func textFieldDidBeginEditing(textField: UITextField) {
backgroundColor = UIColor.greenColor()
}
}
但如果MyTextField
的用户执行此操作:
class ViewController: UIViewController {
@IBOutlet weak var myTextField: MyTextField!
override func viewDidLoad() {
super.viewDidLoad()
myTextField.delegate = self
}
}
行为不起作用;因为与MyTextField的委托关系消失了。
注意:我不仅对成为第一响应者问题感兴趣,而是关于使用委托的任何方法,我的自定义UITextField设置用户的自身作为委托的能力,同一时间。
提前谢谢。
答案 0 :(得分:0)
正如您所说,大多数委托只限于一个对象作为代表。
由于文本字段是响应者,因此您应该能够覆盖func becomeFirstResponder() -> Bool
以更改颜色,同时让对象的用户按预期处理委派。
UIResponder docs:“子类可以覆盖此方法以更新状态或执行某些操作,例如突出显示选择。”