如何在子类化时获取UITextField的委托事件,如果用户将其自身设置为委托,则不会丢失委托?

时间:2016-07-26 12:46:25

标签: ios swift delegates uitextfield subclassing

为简单起见,假设我想创建一个自定义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设置用户的自身作为委托的能力,同一时间。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

正如您所说,大多数委托只限于一个对象作为代表。

由于文本字段是响应者,因此您应该能够覆盖func becomeFirstResponder() -> Bool以更改颜色,同时让对象的用户按预期处理委派。

UIResponder docs:“子类可以覆盖此方法以更新状态或执行某些操作,例如突出显示选择。”