【发布时间】:2014-11-16 21:40:21
【问题描述】:
假设我编写了一个 UITextField 子类并希望控制用户写入其中的文本。我会将输入字段的委托设置为我自己并实现-textField:shouldChangeCharactersInRange:replacementString:。
但是,我仍然希望允许代码的任何部分使用我作为文本字段来实现通常的委托方法。一种方法是存储第二个委托引用并像这样映射它们:
- (id)init {
self = [super init];
super.delegate = self;
return self;
}
- (void)setDelegate:(id)delegate {
self.nextDelegate = delegate;
}
- (id)delegate {
return self.nextDelegate;
}
然后我会继续实现 all UITextFieldDelegate 方法,并按照我的意愿将它们转发给下一个委托。显然,我可能想在将它们传递给下一个委托之前修改一些参数,例如-textField:shouldChangeCharactersInRange:replacementString:。
我正在考虑的另一个问题是当用户将nextDelegate 设置为文本字段本身时(无论出于何种原因),从而导致无限循环。
有没有更优雅的方式来劫持委托回调,就像我发布的示例代码一样?
【问题讨论】:
-
您所描述的基本上是合理的。可能有其他方法可以解决给定的问题,但是您的级联委托是一种应该有效的通用方法。魔鬼当然在细节中——不止有几种方法可以搞砸它。
-
@HotLicks 实际上,它根本不健全,实际上它不起作用。 UITextField 中的代码将使用
self.delegate向委托发送消息,而不是super.delegate,这意味着委托方法实际上将转到self.nextDelegate -
@JeremyP 它正在工作。您介意详细说明您的理论为什么它不应该起作用吗?
-
@ChristianSchnorr 唯一可行的方法是,UITextField 对象在内部使用实例变量向委托发送消息。如果要使用该属性(实际上应该如此),它将调用 your 委托方法来获取委托,而不是超级委托方法。
-
@ChristianSchnorr Nikolai 的回答更详细地解释了这个问题
标签: ios objective-c delegates delegation