【问题标题】:Suppress "undeclared selector" warning in Xcode 5在 Xcode 5 中抑制“未声明的选择器”警告
【发布时间】:2014-03-03 02:47:10
【问题描述】:

我有一个父视图控制器和一个子视图控制器。在子视图控制器的视图中,我有一个名为“startButton”的 UIButton。在该按钮上,我添加了如下目标

[startButton addTarget:[self parentViewController] action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

我已经在父控制器中实现了 test: 方法,这对我来说非常好用。当点击按钮时,事件会从子视图控制器传递到父视图控制器,并在 test: 方法中执行代码 sn-ps。

但我的问题是,我收到一条警告消息“未声明的选择器测试:”。我知道,我得到它是因为 test: 没有在子视图控制器实现文件中实现。

有没有办法单独禁止这个警告?我在这里看到的大多数建议都会抑制整个警告,但我想单独抑制上述警告。

谢谢

【问题讨论】:

标签: ios xcode5 suppress-warnings


【解决方案1】:

如果可以避免警告,则无需抑制

在父视图控制器的@interface(在.h文件中)声明test:方法, 并在子视图控制器的实现 (.m) 文件中导入该 .h 文件。

然后编译器知道该方法并且您不会收到有关 不再声明未声明的选择器。

【讨论】:

    【解决方案2】:

    如果您确定自己做了正确的事情,并且代码实际上运行良好,您可以停止 Xcode 通过使用#pragma clang 预处理器命令包围该方法来警告您。

    例如:

    #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 命令之间的任何“丢失消息”。我建议它们之间的代码尽可能少,以防止代码中的真正问题未被报告。

    【讨论】:

    • 上述答案对我不起作用。将 #pragma ide diagnostic ignored "UnresolvedMessage" 替换为 #pragma clang diagnostic ignored "-Wundeclared-selector" 即可。
    • 谢谢@Pellet。您使用的是哪个版本的 Xcode?这个答案现在可能已经过时了
    【解决方案3】:

    下面的代码会使这个警告消失(dynamic create selector). 但是如果在 parentviewcontroller 中未声明它会在运行时崩溃。

    [startButton addTarget:[self parentViewController] action:NSSelectorFromString(@"test:") forControlEvents:UIControlEventTouchUpInside];
    

    【讨论】:

      【解决方案4】:

      您始终可以在子视图控制器中实现 test:,并执行以下操作:

      - (void)test:(Parameters)param {
            [self.parentViewController test:param];
      }
      

      将目标编辑为 self 而不是 [self parentViewController]

      【讨论】:

        【解决方案5】:

        另一种选择是在协议中声明它(在与选择器用法相同的文件中或它包含的标头中):

        @protocol DummyProtocolToForwardDeclareSelector
        -(void)test:(BOOL)testArgument;
        @end
        

        这将仅针对该特定选择器抑制警告,但您可以将其他选择器添加到同一协议中。

        【讨论】:

          【解决方案6】:

          另一个可能更正确的选择是扩展具有选择器所针对的方法的类的接口。

          @interface ClassThatHasTargetOfSelector ()
          -(void)test:(BOOL)testArgument;
          @end
          

          【讨论】:

            猜你喜欢
            • 2013-12-16
            • 1970-01-01
            • 2011-09-07
            • 1970-01-01
            • 2014-09-23
            • 1970-01-01
            • 2011-02-06
            • 1970-01-01
            • 2015-04-20
            相关资源
            最近更新 更多