【问题标题】:objective-c: Calling a void function from another controller目标-c:从另一个控制器调用 void 函数
【发布时间】:2009-11-13 11:15:09
【问题描述】:

我有一个 void,例如特定控制器中的 -(void) doSomething。 我可以通过 [self doSomething] 在此控制器中调用它,但我不知道如何从另一个 .m 文件中调用此 void。

我想在 -(IBAction) 动作中调用它:(id)sender

我尝试过使用 performSelector,但在日志中出现“unreconiezd 选择器发送”。 我不知道我是否必须使用通知中心或委托...

谢谢, 罗南。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    您的第二个控制器中必须有第一个控制器的实例(您在其中声明函数的那个​​)。

    FirstViewController *firstController = [[FirstViewController alloc] init];
    [firstController doSomething];
    

    如果您的第一个控制器在其他地方声明,并且您希望您的第二个控制器知道它,请在您的第二个控制器中使用 FirstViewController 类型的属性,并在需要时使用您的 FirstViewController 实例对其进行初始化。
    有时,如果您有多个控制器实例并且您希望每个控制器实例都知道所有其他实例,这可能会非常复杂,因此我宁愿建议将您的方法重写为类方法:

    + (void) doSomething;
    

    所以你可以从任何地方调用它

    [FirstViewController doSomething];
    

    【讨论】:

    • 好的,谢谢,我会看看类方法,因为分配对象似乎不起作用(没有错误,但没有任何反应)。
    【解决方案2】:

    如果您有要调用它的对象并且方法是公开的,那么您只需:

    [object doSomething];
    

    【讨论】:

    • 我知道这是旧的,但你能不能把它包裹在 if statement 中,就像 if([object respondsToSelector:@selector(doSomething)]) {} 这样它不会导致 unrecognized selector sent to instance
    【解决方案3】:

    问题是您有两个不知道彼此存在的控制器。通知中心当然是处理这种情况的方法:好处是你不需要在两者之间建立正式的联系。

    委托方法是另一种可能性,但是您必须通过 Interface Builder 中的 IBOutlet 建立连接,或者您必须让一个控制器创建另一个控制器并将自己作为委托传递。这将它们更紧密地联系在一起,这可能合适,也可能不合适。如果两个控制器之间的唯一联系是调用一个 -(void) 方法,那么我会使用 NSNotification。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 2014-12-11
      相关资源
      最近更新 更多