在Cocoa应用程序中共享数据

时间:2011-06-19 06:13:45

标签: objective-c cocoa controller sharing

我已经搜索了如何正确地做到这一点,但我不相信我找到了答案。这是我的设置:

NSWindowController加载2个不同的NSViewControllers(一次只显示一个)。当我将文件放到加载的NSViewController视图上时,我想保存该文件的路径。我可以得到所有这些,但我现在想要做的是当我换到我的其他NSViewController时,我想将这个文件路径传递给新的NSViewController。

我提出的唯一解决方案是从NSViewController发布通知到NSWindowController,然后用这些数据初始化第二个NSViewController,但它看起来相当复杂。有没有办法可以将数据保存在某个地方作为全局实体,然后从我的第二个NSViewController访问它?

注意:NSViewControllers在与另一个交换后会被释放。

任何见解都将受到赞赏。

更新:我只是要更改应用程序,以便两个视图控制器始终在内存中。这样我可以像其他人一样建议并使用KVO或其他方法。

3 个答案:

答案 0 :(得分:3)

视图控制器用于控制模型对象的视图。因此,每个视图控制器必须从某个底层模型对象获取其数据,这可能与您的情况相同。如果您没有,我建议您将应用程序重新设计为MVC模式。

创建视图控制器时,可以设置representedObject属性并将文件名存储为其属性之一。如果您的模型对象符合KVO,您甚至可以让每个视图控制器观察模型对象的文件名属性,并在发生变化时做出反应。

答案 1 :(得分:1)

可以将它保存在某个地方的全局变量/单例中,但这也不是正确的解决方案。

一个选项是为您的第一个视图控制器指向第二个视图控制器,可能作为委托(这样您的第一个控制器不会不必要地依赖于第二个控制器)。然后它可以向其委托发送适当的消息。请注意,如果窗口控制器因任何原因更合适,它也可以是委托。

另一种选择是让第二个视图控制器监听通知而不是窗口控制器。如果第二个视图控制器不存在(或可能不存在),那么让您的窗口控制器处理通知的当前解决方案是非常合理的。

答案 2 :(得分:0)

你是如何进行交换的?假设您有一个导航控制器,它控制哪个视图被推到顶部。为什么不拥有保存文件路径的第二个视图控制器的成员?

这样你就可以在视图控制器上设置这个值并将其推送到导航堆栈进行交换。

SecondViewController *childController = [[SecondViewController alloc] initWithStyle:UITableViewStyleGrouped];
childController.title = @"Second View";
childController.filePath = myFilePath; //this is where you set the member
[self.navigationController pushViewController:childController 
                                     animated:YES];
[childController release];