为简单起见,假设我想创建一个自定义 UITextField
并向其添加一个简单的行为;也就是说,如果文本字段成为第一响应者,背景颜色将变为绿色。
为此,在我的自定义类中,我必须将该类设置为委托(delegate)来接收成为第一响应者的事件。但问题是,如果此自定义文本字段的用户将自己设置为委托(delegate),则事件不会发送到自定义文本字段(因为只有一个对象可以是另一个对象的委托(delegate))
我可以手动转发所有事件,但我正在寻找更清洁、更具可扩展性的解决方案。
这里是一个大概的情况:
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 的委托(delegate)关系已经消失。
Để ý:我不仅对成为第一响应者问题感兴趣,而且它是关于使用委托(delegate)的任何方法,我的自定义 UITextField 的用户将自己设置为委托(delegate)的能力,在同一时间。
Cảm ơn trước.
正如您所说,大多数委托(delegate)仅限于作为委托(delegate)的单个对象。
由于文本字段是响应者,您应该能够覆盖 func becomeFirstResponder() -> Bool
来更改颜色,同时让对象的用户按预期处理委托(delegate)。
UIResponder 文档:“子类可以覆盖此方法以更新状态或执行某些操作,例如突出显示选择。”
Tôi là một lập trình viên xuất sắc, rất giỏi!