【问题标题】:How to get the UITextField's delegates events while subclassing it, without losing the delegation if the user of it set itself as the delegate?如何在子类化 UITextField 时获取委托事件,如果它的用户将自己设置为委托,则不会丢失委托?
【发布时间】:2016-07-26 12:46:24
【问题描述】:

为简单起见,假设我想创建一个自定义 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 的用户可以将自己设置为委托,在同时。

谢谢,提前。

【问题讨论】:

    标签: ios swift delegates uitextfield subclassing


    【解决方案1】:

    如您所说,大多数委托仅限于作为委托的单个对象。

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

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

    【讨论】:

    • @philip 感谢您的回复。问题是,我使用这个例子只是为了简单;我的问题不仅是成为第一响应者;我更感兴趣的是知道如何子类化 UIKit 类并在我的自定义类中使用委托,而不会在我的自定义 UIKit 类的用户将自己设置为委托后丢失委托连接。
    • @philip 顺便问一下,有没有不限于一个对象的委托?
    • 在 SDK 中,我不确定。对于我们希望支持多个回调但结构(即协议)比 KVO 或通知提供的更多的情况,我们已经在内部完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多