2011-03-29 64 views
7

首先,一些背景:我試圖在Cocoa中實現一個主 - 細節接口(用於OS X)。也就是說,我有一個窗口,其中有兩個顯示兩種不同類型對象的NSTableView。對於這個問題,我們假設他們是倉庫和包(選擇與我的實際問題類似的示例)。在第一個表視圖(在倉庫中)中選擇一行將顯示屬於該倉庫的包列表第二個表格視圖。對於模型部分,我目前有一個稱爲倉庫對象倉庫的NSMutableArray,並且每個倉庫對象都有一個包裝對象的NSArray。需要注意的一點是,倉庫變量在加載NIB文件後被修改,因此必須通知NSArrayController在單獨的NIB文件中的多個視圖之間共享一個NSArrayController

現在,我試圖組織它,以便「主」在它自己的視圖對象中,而「細節」在它自己的視圖對象中。這意味着有三個NIB:一個WarehousesView NIB,WarehouseDetailView NIB和一個MainWindow NIB。

  • WarehousesView NIB包含一個WarehousesViewController(從NSViewController分類)和視圖本身的一個實例。
  • WarehouseDetailView NIB包含一個WarehouseDetailViewController實例和視圖本身。
  • MainWindow NIB包含主窗口,MainWindowController的實例以及WarehousesView和WarehouseDetailView的實例。窗口本身包含NSSplitView,並且分割視圖的視圖連接到NIB文件中的相應視圖實例。

這使我想到我的問題的前半部分:

1)這是分裂的Cocoa應用程序的應用程序視圖的好方法?對我來說這是有道理的,因爲在稍後的時間點,除倉庫清單列表外,關於倉庫的更多詳細信息可能會添加到WarehouseDetailView中。

這是一個重要的問題,因爲一切,如果我跳過創建視圖,並直接將所有控件的窗口,把其他一切,包括對應於倉庫和包裹NSArrayController情況下,在同一個NIB文件工作得很好。如果我不這樣做,我不需要問問題的後半部分。

的問題的第二半基本上是:

2)我應該在哪裏放置NSArrayController及其對應於倉庫和軟件包,如果我分裂它如上述那樣,以使主從接口仍然有效?目前我使用Cocoa綁定,所以不知何故倉庫的內容陣列NSArrayController需要綁定到我的倉庫陣列,以及軟件包的內容陣列NSArrayController需要綁定到倉庫的選擇NSArrayController

我已經嘗試了一些東西,我無法完成任何工作。具體來說,我已經嘗試將Warehouses的NSArrayController放入WarehousesView NIB,將NSArrayController放入WarehouseDetailView NIB。這種方法的問題是,我無法找到一種方法來綁定包NSArrayController到Warehouse NSArrayController的選擇。我嘗試的另一件事是(1)將兩個NSArrayController s放入MainWindow NIB中,(2)將這些NSArrayController s連接到MainWindowController中的IBOutlets,然後(3)將這些變量通過它們的構造函數傳遞給它們各自的視圖控制器,( 4)通過KVC將它們作爲視圖控制器中的屬性公開,以及(5)通過文件所有者將視圖中必要的表列綁定到數組控制器。結果是什麼也沒有出現,但也沒有錯誤。如果其中一種方法是實現它的首選方法,我可以提供更多詳細信息以幫助查看我是否做得不正確。

在此先感謝!

編輯:我沒看this related question,他們似乎使用的NSArrayController S表示每個NIB文件不同的實例,如果我理解正確的話,這似乎並沒有從外觀設計上來看是有意義的,但也許我錯了?

回答

1

第1部分:你當然可以做到這一點。我會說這是一個偏好問題。就個人而言,如果視圖將同時顯示在窗口中,我會將它們保持在同一個筆尖中。*模塊化也是一件好事。

第2部分:您可以將陣列控制器放在任何你喜歡的地方,真的。您唯一需要擔心的是讓每個對象獲得所需的引用信息,並將其保存到您想要的信息中。如果你想要我的2¢,我會說每個在視圖中的內容將被顯示在視圖中。這將使你的細節視圖設置更加困難,但它繼續你看起來正在進行的模塊化。

你必須記住,筆尖中的每個對象都是一個真實的實例。筆尖爲你分配並處理它們;如果將一個MyClass對象放在一個筆尖中,並且在另一個筆尖中放入MyClass對象,那麼這兩個對象是兩個不同對象。這對於筆尖來說有時候是一個棘手的問題:爲您自動創建實例會非常方便,但這也意味着當您想要在筆尖之間進行操作時,會引用一些參考。

這聽起來像你把WarehouseViewWarehouseDetailView的實例放入你的單獨的nib和MainMenu.nib中,並且期望它們是相同的對象。它不會如此。您必須將筆尖中的對象鏈接到他們已知的對象。你必須爲你的特殊情況解決這個問題。

我不知道你的模型存儲在哪裏,或者你如何獲得裝入的筆尖。無論它做什麼樣的加載,但是,可能是你的個人筆尖和應用程序的其餘部分之間的聯繫。這是nib中的文件所有者代理對象的用途 - 它爲您提供了一個將nib中的對象連接到他們不會知道的代碼的地方。


*:如果你發現它更容易佈局的意見,如果他們沒有在IB拆分視圖封閉的,你可以設置他們自己:把定製的視圖對象在MainMenu.xib窗口您可以在自己的IB窗口中打開每個視圖(儘管它不會位於應用程序的窗口中)。然後將分割視圖的子視圖設置爲awakeFromNib

相關問題