我正在使用 Cocoa 中的 CoreData(不是基于文档的)。我的问题是,我想从不同的 NIB 访问 SAME NSArrayController。但是每个 NIB 都有一个自己的 NSArrayController 实例。
我现在的问题是如何生成 sharedObjects(如 NSUserDefaultsController)。这对我有很大帮助。感谢您的回答。=)
您通常不想在 nib 之间共享 NSArrayController。拥有多个 NSArrayController(每个 NIB 一个)可能会更好,它们都绑定到同一个底层模型。如果您希望此模型(例如 NSArray)是应用程序全局的,您可以通过 NSApplication 的委托公开它(例如,在 MainMenu.nib 中实例化您的自定义 MyAppDelegate 类并将 NSApplication 的delegate
出口连接到您的 MyAppDelegate 类的实例)。在其他 NIB 中,您可以将 NSArrayController 的contentArray
绑定绑定到Shared Application.delegate.myArray
(假设 MyAppDelegate 通过符合 KVC 的方法公开了一个名为 的 NSArray 绑定myArray
)。您实际上是在使用 IB 和 MainMenu.nib 来创建 MyAppDelegate 的单例实例。
请记住,这种方法会使您的应用程序的单元测试变得困难,因为现在对象图中的单例在测试期间无法模拟或存根。为每个辅助(非 MainMenu.nib)NIB 创建一个 NSWindowController 或 NSViewController 并将这些 nib 中的 NSArrayControllers 绑定到File Owner.myArray
. 然后,您可以实例化 NSWindowController 或 NSViewController,在加载辅助 NIB 之前向其传递一个数组(或数组 KVC 兼容对象)。通过这种方式,您可以单独测试 nib 的功能(使用阵列的模拟或存根)。
我不确定尝试重用 NSArrayController 是不是最好的选择(我需要更多地了解你的项目,但我从来没有遇到过我会做这样的事情的情况),但你可以使用类方法中的静态变量,如下所示:
+ (id)sharedObject;
{
static id object = nil;
if ( object == nil )
{
object = [[self alloc] init];
}
return object;
}
请记住,这不是真正的单例,因为您仍然可以分配该类的其他对象。如果您真的想要严格,可以使用本指南。
Matt Gallagher 在他的博客上有一篇关于单例和其他获取“全局”数据的方法的好文章,您可能也想查看一下。它比 Apple 的文档更清晰一些,并且有一个指向头文件的链接,可以轻松轻松地从几乎任何 Cocoa 类中创建单例。
我实际上在我的一些项目中使用了他的头文件,效果很好。