2011-08-17 85 views
16

我試圖在我的Mac應用程序中將新的基於視圖的OutlineView作爲源列表實現。儘管如此,我無法獲取要顯示的值,因此我從Core Data應用程序模板創建了一個小測試應用程序,但無法正常工作。將基於視圖的NSOutlineView綁定到核心數據

我在我的數據模型中定義了兩個簡單的類;我們稱他們爲「父母」和「孩子」。 有一個屬性,「名稱」,和一個單一的關係,「兒童」。 是一個可選的字符串,並孩子是一個可選的一對多關係兒童孩子具有相同的「名稱」屬性和一對一的「父母」關係,該關係與兒童相反。我生成自定義類的這兩個,並在寫了一存根兒童兒童返回nil

我從對象庫拖了節目源到我的廈門國際銀行,並在樹控制器下降。樹控制器的子項關鍵路徑設置爲「子」,它處於實體名稱模式,其中「父」作爲實體名稱,檢查了準備內容,並將其託管對象上下文設置爲應用程序委託的上下文。樹控制器是大綱視圖的數據源,我使用「objectValue.name」鍵路徑將數據單元的文本視圖綁定到表單元視圖。

-applicationDidFinishLaunching:

我創建了兩個家長情況下,一個具有兒童,並指定每個對象的財產。

實際問題現在

No text

,與設置的出路,我得到行顯示源列表中,但文本字段爲空,即使它們是界。我認爲我不需要做其他任何事情,因爲我使用綁定,並且我相當確定綁定到objectValue屬性是正確的。出了什麼問題?

如果必要的話,我可以提供更多的細節,但我敢肯定,涵蓋一切我做到了。

+0

發現你得到這個工作?我有同樣的問題,所以我試圖複製你的項目。但我正在使用基於文檔的應用程序。我的代理方法從來沒有被調用過,我的單元格中沒有任何文本值。但是,他們確實包含正確的數據。 D你有任何工作代碼我可以看看?將不勝感激!我可以將我的測試項目上傳到github。 – Mikael

+1

您是否將視圖控制器標記爲委託人?如果代理方法根本沒有被調用,那麼你的接線可能是不正確的。如果這不能解決你的問題,你應該發表你自己的問題。 – Dov

+0

不能相信我錯過了。非常感謝! – Mikael

回答

23

哇,這就像我從兩個星期前就問這個問題。

無論如何,如果你喜歡我什麼,問題是,
收視基於NSOutlineViews,你需要實現

- (NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item; 

委託方法並返回NSTableCellView您設置,
或者他們只會給你一個空白的行。要做到這一點最簡單的方法是隻叫

[outlineView makeViewWithIdentifier:@"MyCell" owner:self] 

與你鍵入的任何作爲「用戶接口項目標識」
的身份檢查您NSTableCellView更換MyCell

+0

你的回答雖然看起來正確,但並不使用綁定。 – Richard

+6

除了使用綁定之外,還需要實現此功能。綁定仍然可以處理設置單元格視圖的objectValue,並將單元格視圖的子視圖綁定到該objectValue。但是這個方法仍然需要告訴大綱視圖用於特定行/列的單元視圖。 –

+6

這是必要的,因爲源列表在默認情況下在同一列中使用兩個不同的單元格HeaderCell和DataCell,並且它不能爲您選擇一個單元格,如果您只有一個單元格並將其標識符設置爲自動。 – Dov

5

正如Boaz指出的,你需要實現委託方法來返回一個視圖。考慮到我無法在Docs中找到該方法,這是一個謎。 關於(id)item參數的類型,它是一個NSTreeControllerTreeNode,它是NSTreeNode的一個未記錄的子類。如果您投射它,您可以獲取單元格的對象,並根據什麼類型的對象或該對象的任何屬性確定單元格視圖類型返回不同的視圖。例如

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
NSTableCellView *view = nil; 

NSTreeNode *node = item; 

if ([node.representedObject isKindOfClass:[Group class]]) { 
    view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
} else { 
    view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
} 
return view; 
} 
4

這似乎是對Xcode 4或其附件的更改。接口構建器在NSOutlineView下添加兩個NSTableCellView對象。如果刪除NSTableCellView對象返回到一個理智的,你需要將實現 outlineView(或至少證明)世界:dataCellForTableColumn:項目和outlineView:willDisplayCell:forTableColumn:項目

...或者至少你做,如果你需要一個源列表的樣子。在任何情況下,這都是SourceView示例的設置方式,因此當您嘗試重新創建SourceView示例時,您可能會陷入如此混亂。

另外,如果你想繼續使用NSTableCellView對象(這是非常有用的),那麼你可以:

  • 綁定的NSOutlineView「內容」到你的TreeController.arrangedObjects

  • 綁定NSTextField(和/或NSImageView)在NSTableCellView下與'Table Cell View'一起使用objectValue的模型鍵路徑。 <鍵>

0

我創建了popuplates也popuplates的NSOutlineView,不與CoreData,但關鍵因素是,像@波阿斯 - stuller指出,正確的單元格選擇(類似於你怎麼一點示例項目在iOS的處理UITableViewCell小號

所以在my case我制定的方法,像這樣:。在github

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 

    if ([self isHeader:item]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

退房besi/mac-quickies 大部分的東西在IB要麼做,也可以在AppDelegate

screenshot