2009-02-02 134 views
6

什麼被認爲是不使用Cocoa綁定來處理多個NSTableViews的最佳方式?處理多個NSTableView的最佳方式

在我的應用程序,我有兩塊十分密切相關,我使用了相同的對象委託和數據源兩個NSTableViews。問題是兩個tableView都調用相同的方法。我目前基於NSControl -tag區分兩個tableViews。

我進入這個代碼越深,使用-tag容貌的醜陋。我最終創建了大量重複的代碼來區分每個委託/數據源方法中的tableViews。代碼最終明確地不是面向對象的。

我可以創建一個單獨的對象來處理一個或其他的tableView,但表示對象的創建將在很大程度上人工構建只需提供一個不同的委託/數據源。

現在每個人都在使用Cocoa Bindings嗎?我正在避免Bindings,因爲我希望通過可在Mac OS和iPhone之間轉換的技巧來磨練我的Cocoa技能。

回答

10

NSTableView的每個委託/數據源方法都將N​​STableView的實例作爲第一個參數(除了那些通過NSNotification對象的情況外,在這種情況下NSNotification的object是表視圖實例)。一些例子包括:

- (int)numberOfRowsForTableView:(NSTableView*)aTableView;

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification

如果你正在使用一個控制器控制對象爲多個表的委託/數據源,你可以使用該參數來區分他們。

+0

我目前使用的NSControl - 標籤方法,發送給你指出的tableView的說法,到tableViews區分。使用-tag似乎比使用tableView參數本身更確定一些,因爲我必須將參數與某些內容進行比較以確定tableView。 – 2009-02-02 22:56:35

+2

是的,通常情況下,您還可以在IB中設置從您的控制檯到桌面視圖的網點,因此您可以將傳入的表格視圖與您的網點進行比較,以確定哪個是哪個網點。 – 2009-02-04 06:03:50

2

聽起來你應該使用爲每個視圖不同的委託對象,但相同的數據源。換句話說,用於不同視圖和控制器對象的單個模型。

我不認爲這是一個人爲的區分,因爲對象有足夠不同的目的,但要使用相同的數據。你現在違反的規則越大,每個對象應該有一個目的。每個對象的目的可能是以特定方式檢索和顯示數據。

祝你好運!

3

的方法:

- (void)tableViewSelectionDidChange:(NSNotification *)aNotification 

你可以使用:

NSTableView *theTable = (NSTableView *)[aNotification object]; 
if(theTable==listeDesMots) 
...