目标C类之间的通信

时间:2009-12-23 23:13:28

标签: objective-c class methods

我有一个AppController类,以通常的方式在我的应用程序中查看视图/控件。

我的应用程序主窗口上有一个按钮,导致AppController实例化一个新的窗口控制器(accountPanelController)并显示该辅助窗口:

- (IBAction) showAccountPanel:(id) sender
{
    //Is accountController nil?
    if (!accountPanelController) {
        accountPanelController = [[AccountPanelController alloc] init];
    }

    [accountPanelController showWindow:self];
}

完成新窗口后,我想将从辅助窗口控制器收集的数据发送到AppController中的方法:

- (IBAction) close: (id) sender
{
    NSLog(@"Close detected");
    [AppController addAccount:0];
    [self close];
}

然而,当我尝试从新窗口控制器调用AppController中的addAccount方法时,我得到一个“'AppController'可能无法响应'+ addAccount'”警告。

这似乎与AppController是一个类而不是对象实例化有关,因为AppController中的方法被称为-addAccount(而不是警告中报告的+ addAccount)。实际上,如果我将目标方法的名称更改为+ addAccount而不是-addAccount,则不会出现警告(但程序在执行时崩溃)。

鉴于我实际上并没有自己实例化AppController(我想这会在NIB启动期间以某种方式发生),有没有人有任何想法如何将数据发送到AppController方法?通知似乎有点过分......

非常感谢。

2 个答案:

答案 0 :(得分:4)

我推荐以下关于Apple Mac开发中心的介绍文章:Communicate with Objects - #Notifications
更新
我指出了相关锚点(通知)的链接。

您的代码示例中的问题是,您调用类方法(带有+的方法),但是您实现了一个实例方法( - )。
因此,一个简单的解决方法是获取AppController(代码中可能为self)的(共享)实例,并向其发送addAccount:消息。
但我鼓励你先阅读这篇文章。

也许您可以通过向您的控制器发送通知(NSNotification)来解决您的问题。

<强>更新
另一个有趣的读物可能是this SO question regarding the difference between class methods and instance methods

答案 1 :(得分:1)

只需提供一个intiWithOtherController方法并将其添加为:

accountPanelController = [[AccountPanelController alloc] initWithOtherController:self];

只是通过自我,所以你需要这样的东西:

(AccountPanelController *) initWithOtherController:(OtherController *) 

现在你有一个指向otherController的指针,你可以这样做:

[otherController addAccount:0]