委托方法如何知道何时被调用?

3
我想知道委托方法是如何知道何时被调用的?例如,在 UITextFieldDelegate 协议中,当文本字段开始编辑时(我实现了此方法),将调用 textFieldDidBeginEditing:方法。
那么,代码是如何检测何时调用 textFieldDidBeginEditing:呢?系统是否只是检查是否已经实现了 textFieldDidBeginEditing:,如果已经实现,则运行该方法?这其中是否有一些看不见的东西?
2个回答

3

没错。

我无法保证苹果的框架代码在底层是如何实现的,但一个极其常见的说法是:

if ([[self delegate] respondsToSelector:@selector(someInstance:didDoSomethingWith:)]) {
    [[self delegate] someInstance:self didDoSomethingWith:foo];
}

这允许您拥有可选的委托方法,这似乎是您的问题。

经过检查后,我会使用“performSelector”代替,这样编译器就会满意。 - Nicolas Miari
2
考虑到委托将是id<UITextFieldDelegate>类型,不需要使用performSelector来让编译器满意。 - CrimsonDiego
@ranReloaded @CrimsonDiego 的说法完全正确,这就是为什么你不需要使用“-performSelector:”。实际上,“-performSelector:”在传递给选择器指示的方法的参数方面非常有限,因此通常不适合这种目的。 - Conrad Shultz
1
@ranReloaded 另外,在特殊情况下,强制将对象转换为符合协议的类型以抑制编译器警告可能是必要的,但这在我的经验中是相当罕见的。 - Conrad Shultz
我还没有检查过,但只要声明委托符合协议,编译器就不会警告可能未实现的 @optional 方法? - Nicolas Miari

0

代码没有“检测何时调用”委托方法。textField 接收事件,并在其委托上调用该方法(该方法已实现 textFieldDidBeginEditing:)。

简而言之,当您点击文本字段以开始编辑时,textField 会说“哦,我正在编辑!”并在内部调用 [self.delegate textFieldDidBeginEditing:self],其中委托是您设置为委托的实例(通常是 UIViewController 子类)


1
并不完全正确。如果委托方法是可选的,代码可能需要知道何时调用委托方法。textFieldDidBeginEditing:是一个非常可选的方法,因此仅仅调用它(如您所建议的)会导致运行时错误/崩溃,如果[self delegate]非空但没有实现该特定方法。 - Conrad Shultz
1
在我看来,他是在问它如何知道何时调用方法,而不是如何知道方法是否被实现,这种情况下,我的答案仍然是正确的。我没有添加respondsToSelector,因为他提出了一个普遍性问题,只是举了一个可选的例子。并非所有的代理协议都是可选的,因此我的答案仍然是有效的。 - CrimsonDiego
嗯,我想我们有不同的解释(只有原帖作者能够澄清)。我理解“系统是否只是检查textFieldDidBeginEditing是否已经实现并运行该方法?”是对检查实现的担忧的表达。 - Conrad Shultz
标题中已经说得很清楚了,实际上在整个问题中都提到了三次。问题是:“委托方法何时知道要被调用”,而不是“它如何知道是否可以调用委托方法”。 - CrimsonDiego
我并不反对它所说的;也许我只是读入了太多问题,因为我不想相信它真的那么简单(如果是这样,你的答案当然是完全正确的)。 - Conrad Shultz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接