【问题标题】:Connect to an IOS IBAction which is not at a "valid connection destination"连接到不在“有效连接目的地”的 IOS IBAction
【发布时间】:2012-03-08 10:05:48
【问题描述】:

我花了好几天的时间来将故事板上的按钮连接到 IOS 项目中的新 NSObject 类。我在 OS X 中使用的方法在 IOS 中不再适用。

我没有问题将按钮连接到原始 UIViewController 类上的 IBAction。根据 Apple 文档,我的新课程不是“有效的连接目的地”。

为了解决这个问题,我尝试从 UIViewController 类调用新类中的方法。我尝试了通知和委托方案,使用 Stack Overflow 上的帖子,但无法让它们工作。

我最接近的链接到目标类中的 + 方法,例如

+ (void) startToneGenerator
{
    NSLog(@"Arrived in startToneGenerator");  
//        [self startPlay:nil];
}

但是,从该方法内部,我无法在同一个类中调用 -startPlay。因为 -StartPlay 类是音频单元构造的一部分,所以我无法在不破坏音频单元的情况下将其更改为 +starPlay 类。

谁能指点我一些描述“有效连接目标”真正含义的文档,以及如何使尝试的连接成为有效连接。


我在 OS X 中使用了答案 1 中建议的方法,它确实有效,但在 IOS 中不再有效。 我正在重申您澄清问题的代码。

// code in VC

- (IBAction)RunPauseStop:(id)sender
  {                
   NSLog(@"arrived in RunPauseSTop");   // OK

   [uToneGenerator testMethod]; // OK                 
   //  [uToneGenerator startPlay:self]; // crashes
}


// code in uToneGenerator

+ (void) testMethod
{
NSLog(@"arrived in <testMethod>");   // OK  
//  [uToneGenerator startPlay:nil];  // crashes
}


- (IBAction)startPlay:(id)sender
{
NSLog(@"arrived in <startPlay>"); // Don't get here           
}

行 [uToneGenerator startPlay:nil];编译(带有警告)但崩溃:

2012-03-06 13:20:25.509 耳鸣驯服器 IP[863:f803] +[uToneGenerator startPlay:]:发送到类 0x6c40 的无法识别的选择器 2012-03-06 13:20:25.509 耳鸣驯服器 IP[863:f803] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[uToneGenerator startPlay:]:无法识别的选择器发送到类 0x6c40'

从 testMethod 调用;编译但崩溃: 2012-03-06 13:22:31.413 耳鸣驯服器 IP[885:f803] +[uToneGenerator startPlay:]:无法识别的选择器发送到类 0x6c44 2012-03-06 13:22:31.414 Tinnitus Tamer IP[885:f803] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[uToneGenerator startPlay:]:无法识别的选择器发送到类 0x6c44'

我注意到错误信息找不到+[uToneGenerator startPlay:,但我试图调用的方法是-[uToneGenerator startPlay:


uToneGenerator *utg = [[uToneGenerator alloc]init];工作正常。尽管有编译器警告“NSProject 可能无法响应‘startPlay’。

感谢您帮助我。非常感激。我真的被卡住了。

【问题讨论】:

    标签: ios


    【解决方案1】:

    您需要在 VC 的 IBAction 方法中调用任何您想要的类方法:

    - (IBAction)myButtonPressed:(id)sender {
         [MyClass myClassMethod];
    }
    

    【讨论】:

      【解决方案2】:

      如果您希望该代码正常工作,您必须使用+ 声明- (IBAction)startPlay:(id)sender。否则你将不得不创建你的类的一个实例:

      uToneGenerator *utg = [[uToneGenerator alloc]init]; //or whatever you use
      

      然后用它来调用你的startPlay 方法:

      [utg startPlay:self];
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-17
        • 1970-01-01
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多