2016-07-26 57 views
1

为了简单起见,假设我想创建一个自定义UITextField,我想向它添加一个简单的行为;也就是说,如果文本字段成为第一个响应者,则背景颜色将更改为绿色。如何获取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

正如你所说,大多数代表团只限于作为代表的单个对象。

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

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

+0

@philip感谢您的回复。事情是,我只是为了简单而使用这个例子;我的问题不仅仅是成为第一响应者,我更感兴趣的是知道如何在我的自定义UIKit类的用户将自己设置为委托后将子类化为UIKit类并在自定义类中使用委托而不会丢失委派连接。 – Erfan

+0

@philip顺便说一下,是否有任何代表团不仅限于一个对象? – Erfan

+0

在SDK中,我不确定。我们在内部完成了我们想要支持多个回调但具有比KVO或通知提供的更多结构(即协议)的情况。 –