2010-08-01 117 views
7

我想知道一個如何實施,如一個的Xcode 3的概略圖不同的細胞(和數據類型)NSTableView的是使用用於生成配置:實施NSOutlineView /每

alt text http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

當使用具有綁定的NSOutlineView/NSTableView和NSTreeController/NSArrayController,出於顯而易見的原因,視圖的列獲得分配給的綁定,而不是單個單元。 如果一列中的每一行都使用同一個單元格,那麼它就是小菜一碟。但是,如果每行(可能)使用自己的單元格類型(並且可能包含它自己的綁定集合),那麼情況會變得很怪異。

查看屏幕截圖可以清楚地看到,textfield單元格只需要一個「值」的綁定。而彈出按鈕單元至少需要一個「內容」,一爲「contentValues」和最後但並非最不重要一個「的selectedIndex/selectedObject/了selectedValue」結合。並且複選框單元需要「」和(可能)一個用於「標題」的綁定。

如何以儘可能乾淨的(儘可能少的)代碼實現這一點?
或者像有人可能會問:如何將蘋果已經做到了?)

...

這裏就是我試過自己至今:
我提供適當的(複製)細胞通過[outlineView:dataCellForTableColumn:item:]並將它們綁定到各個數據模型(來自[itemrepresentObject])。 我知道在大綱視圖中顯示的數據的確切數量(< 500行),因此每行有一個單元不應該是太多的內存問題,不是? 我得到數據通過綁定(yay!)正確顯示但我無法更改它們的任何值。 O_o 顯然,值更改根本不會傳遞給數據模型。有沒有比簡單的[checkboxCell bind:@「value」toObject:rowModel withKeyPath:@「value」options:nil]? (因爲這似乎足夠越來越值,而不是設置他們相應。)

我找不到關於這個主題的信息。很多關於每列使用自定義單元格的信息和提示,但沒有在「每行」基礎上使用它們的信息和提示。 :(
這將使一些可可教程的偉大的東西,不是嗎?;)

+0

還有NSDictionaryController。不知道它會讓你走多遠,但看一看。 – 2010-08-01 21:05:12

+0

@Mike它不是控制器的問題,而是處理其單元格的表視圖之一。但是,無論如何感謝:) – Regexident 2010-08-02 00:25:31

+0

差不多5年後,這是我能找到的關於在具有不同單元格的表格上將數據源綁定到數據源的唯一信息,「這對於Cocoa教程來說會是一些不錯的東西,不是嗎?」 ,是的! – rraallvv 2015-03-12 04:05:42

回答

3

一列的數據單元格不復制。單元格配置爲每行中列的正確值並繪製在適當的位置。掛鉤的好地方是NSTableColumn方法-dataCellForRow:。在自定義子類中,您可以重寫此方法,並傳遞其正常操作的-dataCell或某種備用單元類型。

我有一個機會,在只顯示兒童(非根項目)的大綱視圖中有一個代表「包含」的複選框列。根項目不能排除,只有他們的子項,所以只顯示非根項目的複選框是有意義的。

我創建了一個帶有委託(我的數據源控制器)的自定義NSTableColumn子類,並檢查它是否響應了選擇器-deadCellColumn:shouldShowDeadCellForRow :.如果是這樣,我就調用了這個方法(它在我的數據源控制器上實現),詢問它是否應該顯示一個「死單元」(一個基本的NSCell子類,它什麼都不畫)並根據答案進行交換。如果委託沒有對選擇器作出響應,則表格列將返回其正常的-dataCell。

這裏需要自定義單元格(我稱之爲「DeadCell」),因爲我想確保沒有繪製任何東西,也沒有任何可編輯的東西。我不確定這是絕對必要的,但我仍然這樣做。這在你的案例中並沒有多大用處,但我想要說明它的完整性。

您的情況有點複雜,尤其是因爲綁定涉及(並且不同的數據單元類型可能具有不同的綁定值 - 彈出窗口尤其具有挑戰性)。就我而言,我避免了綁定嘗試和真正的數據源機制。它大大簡化了事情。 :-)對於您的情況,使用數據源方法交換單元格類型非常簡單。

+0

噢,我的...我想我會'_just'_必須統一我的數據輸入然後(使用ComboBoxCells方便地訪問模板值),並使用NSFormatters確保每個項目的值類型的正確輸入。不是很漂亮,但是需要這種表格視圖的功能不夠大/不夠重要,無法投入如此巨大的後端代碼,並且可能會引發混亂。 雖然這種東西是如此糟糕的工作,但主要是好消息。 – Regexident 2010-08-02 00:23:08

+0

根本沒有hackery參與。這都是控制/單元機制的有效使用。另外,Cocoa Bindings更多的是面向事物的「快速應用程序開發」方面,這隻消除了更廣義情況下的代碼。如果你想做特別的事情,你必須使用代碼。在很多情況下,您可以混合使用兩種(綁定和數據源)。在這種情況下,如果您的單元格類型都共享相同的綁定,則只需要您的自定義列,其他所有內容都應該「正常工作」。 – 2010-08-02 00:54:21

+0

是的,但他們做**沒有**共享相同的綁定:( 無論如何,該功能將成爲一個書呆子,與潛在的用戶羣非常有限,所以根本不值得這麼多的努力,同時延緩產品發佈。 (「偉大的開發者出貨」,對吧?;) 但是,感謝您的解決方案,我確信我會有一些使用它不是太遙遠 – Regexident 2010-08-02 19:27:56