2009-01-27 122 views
2

我正在使用可可中的CoreData(不是基于文档)。 我的问题是,我想从不同的NIB访问SAME NSArrayController。 但是每个NIB都有一个自己的NSArrayController实例。Cocoa中的共享对象

我的问题是现在我怎么能生成sharedObjects(就像NSUserDefaultsController)。 它会帮助我很多。感谢您的回答。 =)

回答

5

您通常不希望在nib之间共享NSArrayController。最好多个NSArrayController(每个NIB一个)绑定到同一个基础模型。如果你想这个模型(例如一个NSArray)是全球应用程序,你可以通过的NSApplication的委托将其暴露(如实例化MainMenu.nib中自定义MyAppDelegate类和的NSApplication的delegate插座连接到您的MyAppDelegate类的实例)。在其他的发钞银行,然后你可以绑定一个NSArrayController的contentArray结合Shared Application.delegate.myArray(假设MyAppDelegate自曝,通过KVC兼容的方法,一个NSArray绑定称为myArray)。您基本上使用IB和MainMenu.nib来创建MyAppDelegate的单例实例。

请记住,这种方法使得单元测试你的应用程序很难,因为现在有对象图,你不能嘲笑或测试过程中,踩灭了单身。为每个辅助节点(非MainMenu.nib)NIB创建NSWindowController或NSViewController会更好,并将这些节点中的NSArrayControllers绑定到File Owner.myArray。然后,您可以实例化NSWindowController或NSViewController,并在加载辅助NIB之前向其传递一个数组(或数组符合KVC的对象)。通过这种方式,您可以单独测试笔尖的功能(使用模拟或存根)。

+1

这描绘了一个应用程序流程的清晰图片,而不是百万份asinine Apple文档的页面。 – 2012-03-04 03:06:42

2

我不确定要重用NSArrayController是最好的选择(我需要更多地了解你的项目,但我从来没有遇到过这样的情况,我会做这样的事情) ,但您可以使用一个静态变量类方法里,像这样:

+ (id)sharedObject; 
{ 
    static id object = nil; 

    if (object == nil) 
    { 
     object = [[self alloc] init]; 
    } 

    return object; 
} 

请记住,这是不是一个真正的单身人士,因为你仍然可以分配该类的其他对象。如果你真的想要严格,你可以使用this guide

1

马特·加拉格尔有good post on singletons and other ways to have "global" data在他的博客上,你可能想看看了。它比Apples文档更清晰一些,并且有一个头文件的链接,可以很容易地创建几乎任何Cocoa类中的单例。

实际上,我用我的一些项目,他的头文件,它的伟大工程。