Objective C类之间的通信

3

我有一个AppController类,通常负责我的应用程序的视图/控制。

在IB中,我的应用程序主窗口上有一个按钮,它会导致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' may not respond to '+addAccount'”警告。
这似乎与AppController是一个类而不是对象实例有关,因为在AppController中的方法被称为-addAccount(而不是警告中报告的+addAccount)。确实,如果我将目标方法的名称更改为+addAccount而不是-addAccount,则不会出现警告(但程序在执行时会崩溃)。
考虑到我实际上并没有自己实例化AppController(我猜这在NIB初始化期间发生了),有人有任何想法如何将数据发送到AppController方法吗?通知似乎过于复杂...
非常感谢。
2个回答

4
我建议阅读苹果的Mac Dev Center上的以下入门文章:Communicate with Objects - #Notifications
更新:
我将链接指向了相关的锚点(Notifications)。
你代码示例中的问题是,你调用了一个类方法(以+开头的方法),但是你实现了一个实例方法(以-开头的方法)。
所以一个简单的解决方法是,获取你的(可能是你的代码中的)的(共享)实例,并发送消息给它。
但我鼓励你先阅读这篇文章。
也许你可以通过从你的视图向你的控制器发送通知(NSNotification)来解决你的问题。 更新:
对于你来说,另一篇有趣的阅读材料可能是关于类方法和实例方法之间区别的这个SO问题

非常感谢。我阅读了所有的链接。问题在于AppController是一个我不实例化的类,但IBuilder指向其中的(IBAction)s。因此,我没有办法指向AppController在实例化时生成的实例。通知可以工作。有没有更简单的方法?即使Hillegass在他关于面板的章节中也使用了通知。许多应用程序都需要从第二个窗口获取数据,所以这一点肯定很常见?我不熟悉共享实例,并且努力寻找一些文档。您是否知道任何可能有所帮助的文档? 如下所示,我尝试了[self addAccount],但没有成功。 再次感谢。 - Liam G
你可能可以使用[NSApplication sharedApplication],它是应用程序委托的共享实例。但我认为在这里使用通知是正确的做法。 - Thomas Zoechling

1
只需提供一个intiWithOtherController方法并将其添加到此处:
accountPanelController = [[AccountPanelController alloc] initWithOtherController:self];

只需传递self,所以你需要像这样:

(AccountPanelController *) initWithOtherController:(OtherController *) 

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

[otherController addAccount:0]

搞定了。简单易行。谢谢。 唯一的问题是,要想办法在initWithOtherController返回后保持对otherController指针的控制,以便在窗口的close方法中使用它。 - Liam G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接