跨 Cocoa 应用程序共享数据

Posted

技术标签:

【中文标题】跨 Cocoa 应用程序共享数据【英文标题】:Sharing data across a Cocoa application 【发布时间】:2011-06-19 06:13:44 【问题描述】:

我已经搜索了如何正确执行此操作,但我不相信我找到了答案。这是我的设置:

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

我想出的唯一解决方案是从我的 NSViewController 向 NSWindowController 发布通知,然后用这些数据初始化第二个 NSViewController,但这似乎相当复杂。有没有一种方法可以将数据保存为全局实体,然后稍后从我的第二个 NSViewController 访问它?

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

任何见解都将不胜感激。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我的问题是我释放了要切换的控制器,所以我需要将信息保存到 nswindowcontroller 或其他东西。 好吧,你可以重新考虑这个决定,或者你可以让窗口控制器成为你的第一个视图控制器的委托,让它弄清楚如何处理数据。 好的,我理解这种方法,只是不喜欢有很多代表或通知。如果我没有得到太多其他信息,我会将您标记为正确的。非常感谢您的帮助! 我只是没有看到很多其他选项......视图控制器要么继续存在,要么不存在。如果他们这样做,他们可以直接互相发送消息。如果他们不这样做,您需要一个中间对象,例如您的窗口控制器来 a) 获取消息,并 b) 创建下一个视图控制器。无论如何,祝你好运! ;-)【参考方案3】:

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

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

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];

【讨论】:

这是一个 NSViewController 即 Mac OS X 而不是 ios Mac OS X 中没有导航控制器。他使用的是NSViewControllers,而不是UIViewControllers

以上是关于跨 Cocoa 应用程序共享数据的主要内容,如果未能解决你的问题,请参考以下文章

5Android-跨程序共享数据--内容提供器

Android 跨程序共享数据,探究内容提供器

android: 实现跨程序数据共享

在 iOS 上跨多个应用程序共享数据

Android学习--跨程序共享数据之内容提供其探究

在 Vuejs 中跨不同组件共享数据