我很确定这是一个简单的问题,但这是我无法解决的问题。
我在if语句中使用respondsToSelector
方法来检查委托是否实现了方法。在if语句中,我然后调用此选择器。没什么复杂的。但我得到一个警告,说找不到方法,(Screenshot)。但是,如果我包含实现该方法的类的头文件,警告就会消失。
我怀疑它可能与源编译的顺序有关吗?
任何帮助都非常感激。
答案 0 :(得分:1)
虽然您可以使用@selector(somethingHere:)
创建任意选择器,但如果没有编译器警告,则无法在id
变量上调用任意方法。编译器仍将检查您正在调用的方法/选择器是否已在类或类别上定义某处。
您需要包含适当的标头,以便编译器知道系统中有可以响应该方法的对象/类,否则您可能会错误地键入选择器并且永远不会知道它。
编辑:
好的,我现在看到你正在实现一个委托。在这种情况下,您需要使用适当的方法声明协议,并为您的委托使用类型id<ProtocolName>
。然后你的类应声明为实现该协议。
答案 1 :(得分:-1)
如果你想隐藏 id 数据类型背后的真实类,而不是写 someProtocol 而不是在ivars中定义_delegate并指定它实现该协议的内容。
id<someProtocol> _delegate;
答案 2 :(得分:-1)
确保已在协议中声明了该方法。