我有一个父视图控制器和一个子视图控制器。在子视图控制器的视图中,我有一个名为“startButton”的UIButton。对于那个按钮,我添加了一个目标,如下所示
[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
我在父控制器中实现了test:方法,这对我来说非常好。当点击按钮时,事件从子视图控制器传递到父视图控制器,并且test:method中的代码片段被执行。
但我的问题是,我收到一条警告信息,“未申报的选择器测试:”。我知道,我得到它因为test:没有在子视图控制器实现文件中实现。
有没有办法单独抑制此警告?我在这里看到的大多数建议都会使整个警告被抑制,但我想单独抑制上述警告。
由于
答案 0 :(得分:16)
如果您避免,则无需取消警告:
在父视图控制器的接口(.h文件)中声明test:
方法,
并在子视图控制器的实现(.m)文件中导入.h文件。
然后编译器知道该方法,并且您没有得到关于a的警告 未宣布的选择者。
答案 1 :(得分:15)
如果你确定你已经做了正确的事情,并且代码实际上工作正常,你可以通过用#pragma clang预处理器命令包围方法来阻止Xcode警告你。
例如:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
#pragma clang diagnostic pop
Xcode不会报告push和pop命令之间的任何“缺失消息”。我建议在它们之间尽可能少地使用代码来防止代码中的实际问题被解除。
答案 2 :(得分:1)
以下代码会使此警告消失(dynamic create selector).
但如果在parentviewcontroller中未声明,它将在运行时崩溃。
[startButton addTarget:[self parentViewController] action:NSSelectorFromString(@"test:") forControlEvents:UIControlEventTouchUpInside];
答案 3 :(得分:0)
您始终可以在子视图控制器中实现test:并执行以下操作:
- (void)test:(Parameters)param {
[self.parentViewController test:param];
}
将目标编辑为自我而不是 [self parentViewController]
答案 4 :(得分:0)
另一种选择是在协议中声明它(与选择器用法相同的文件或它包含的头文件):
@protocol DummyProtocolToForwardDeclareSelector
-(void)test:(BOOL)testArgument;
@end
这将仅针对此特定选择器禁止警告,但您可以将其他选项添加到同一协议中。
答案 5 :(得分:0)
另一个可能更正确的选择是扩展具有选择器所针对的方法的类的接口。
@interface ClassThatHasTargetOfSelector ()
-(void)test:(BOOL)testArgument;
@end