2009-01-27 108 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類中的單例。

實際上,我用我的一些項目,他的頭文件,它的偉大工程。