gpt4 book ai didi

ios - Objective-C 中的委托(delegate)级联和劫持委托(delegate)回调

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:59:45 24 4
gpt4 key购买 nike

假设我编写了一个 UITextField 子类,并希望控制用户写入其中的文本。我会将输入字段的委托(delegate)设置为我自己并实现 -textField:shouldChangeCharactersInRange:replacementString:

但是,我仍然希望允许代码的任何部分将我用作文本字段来实现通常的委托(delegate)方法。一种方法是存储第二个委托(delegate)引用并像这样映射它们:

- (id)init {
self = [super init];
super.delegate = self;
return self;
}

- (void)setDelegate:(id)delegate {
self.nextDelegate = delegate;
}

- (id)delegate {
return self.nextDelegate;
}

然后我将继续实现所有 UITextFieldDelegate 方法,并根据需要将它们转发给下一个委托(delegate)。显然,我可能想在将它们传递给下一个委托(delegate)之前修改一些参数,例如 -textField:shouldChangeCharactersInRange:replacementString:.
我想到的另一个问题是,当用户将 nextDelegate 设置为文本字段本身(无论出于何种原因)时,会导致无限循环。

是否有更优雅的方式来劫持委托(delegate)回调,就像我发布的示例代码中那样?

最佳答案

您的方法的问题是重写的 delegate 访问器:不能保证 Apple 的代码总是直接使用 delegate ivar 而不会使用 getter 访问委托(delegate)。在这种情况下,它会直接调用 nextDelegate,绕过您偷偷加入的 self 委托(delegate)。

您可能已经检查过您的方法在当前实现中是否有效,但这也可能在未来的 UIKit 版本中发生变化。

Is there a more elegant way to hijack delegate callbacks like in the example code I posted?

不,我不知道有任何优雅的解决方案。您无法覆盖委托(delegate)访问器,而是设置辅助委托(delegate)(您必须手动将所有委托(delegate)消息传递给它)。

要解决过滤文本输入的实际问题,可能值得研究一下

- (void)replaceRange:(UITextRange *)range withText:(NSString *)text;

此方法由 UITextField 实现(因为它采用了 UITextInput)并且可以被覆盖以过滤 text 参数。

关于ios - Objective-C 中的委托(delegate)级联和劫持委托(delegate)回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com