2009-11-28 44 views
2

蘋果有一個很好的教程來製作一個簡單的主從接口。 Interface Builder甚至會從核心數據實體爲您自動生成一個。但是,我試圖做一些比簡單的例子更復雜的事情,我一直在努力爭取它的工作。如何使用核心數據和抽象實體創建主 - 細節界面?

我有一個基於Core Data文檔的應用程序。該模型包含一個抽象實體Page以及Page的幾個具體子實體。所有頁面都有一些共同的屬性(如「名稱」),這些屬性在Page中定義。顯然,這些子實體具有它們獨有的屬性。

我想讓界面允許用戶查看主列表(NSTableView)中的所有類型的頁面。當他們選擇一個頁面時,顯示的明細字段將取決於它是什麼樣的頁面。

這就是我現在所擁有的:

我有一個主要的筆尖文件,其中顯示主列表,以及常見的頁面的所有領域。每個頁面類型都有一個筆尖及其特定字段。主nib文件中有主要的NSArrayController,它填充了NSTableView。每個頁面特定的nib中都有一個NSArrayController,以便我可以將詳細信息字段綁定到當前選擇的屬性。我所有的NSArrayController都配置相同,並且我將它們綁定到相同的managedObjectContext和相同的selectionIndexes。

我正在使用Aaron Hillegass的方法進行視圖交換,他在他的可可書中描述過。所以我註冊了NSTableViewSelectionDidChangeNotifications,當我收到一個,它調用的方法SWITCHVIEW:

SWITCHVIEW着眼於當前選定的對象,檢查它的網頁類型,以及掉期根據Hillegass的方法,適當的筆尖文件。

一切工作正常,如果我只添加一種類型的頁面,但只要我添加第二個類型的頁面,我得到這個錯誤:

Error setting value for key path selectionIndexes of object (from bound object entity: Page, number of selected objects: 1): [ valueForUndefinedKey:]: the entity NoColPage is not key value coding-compliant for the key side.

錯誤的最後一部分是有道理的:它試圖顯示錯誤的筆尖,因此它試圖綁定到這個對象不存在的字段。

我添加了selectionIndexes字段到MyDocument,以便我所有的NSArrayControllers都可以綁定到同一個地方。我已經爲此折磨了好幾天,我無法弄清楚。有任何想法嗎?如果有幫助,here is a sample project you can download。我只從我的項目中提取了與這個問題相關的東西,並將其用於測試和玩耍。

PS:用於從Core Data實體生成主 - 細節接口的Interface Builder工具不像我希望它用於抽象實體那樣工作。它只爲超級屬性創建字段。

編輯:我認爲約書亞是一個東西,但不幸的是,它不工作 - 我一直在遇到同樣的問題。起初我遇到了困難,因爲我不明白-unbind:期望一個字符串常量,而不是一個關鍵路徑。

我已經嘗試了幾種變化:我跟蹤當前顯示的筆尖的數組控制器;在那裏我跟蹤當前顯示的頁面類型,並且只在我嘗試顯示不同的頁面類型時解除綁定/重新綁定...

下面是代碼的相關部分。

-(void) displayViewController: (ManagingVC *) vc withClass:(NSString*) className { 

//Try to end editing 
NSWindow *w = [box window]; 
BOOL ended = [w makeFirstResponder:w]; 
if (!ended) { 
    NSBeep(); 
    return; 
} 

//The Managing View Controller's NSArrayController 
NSArrayController* vcAc = [vc arrCont]; 

//if the page we're trying to switch to is NOT the same type as the current page we're displaying 
//if it is, do nothing. 
if (![currPageDisplayed isEqual:className]) { 

    //unbind the old view controller 
    ManagingVC *oldvc = [viewControllers objectForKey:className]; 
    NSArrayController* oldsac = [oldvc arrCont]; 
    [oldsac unbind:@"selectionIndexes"]; 

    //bind the new view controller 
    [vcAc bind:@"selectionIndexes" toObject:self withKeyPath:@"selectionIndexes" options:nil]; 
    currPageDisplayed = className; 

    NSView *v = [vc view]; 

    //display the new view in an NSBox in the main nib 
    [box setContentView:v]; 
} 

}

+0

這實際上無關與核心數據 - 刪除該標籤,這現在。 – 2009-11-28 14:44:06

回答

0

花費了太多時間試圖讓每個NIB的陣列控制器同步,我放棄了這種方法。唯一對我有用的是以編程方式控制哪些GUI元素顯示在主要筆尖中,以及它們的綁定。這意味着消除其他筆尖。如果你的工作不僅僅是一些文本字段,這不是一個可持續的解決方案,但它現在適用於我。

我仍然沿用解除綁定約書亞的忠告切換視圖之前,但現在我只綁定文本字段arrayController.selection.whateverKey

1

問題是你要離開你的筆尖綁定到文檔的選擇,這是造成他們試圖(選擇更改時)來表示選定項目陣列控制器。

試試這個:

  1. 在筆尖刪除綁定。
  2. 在添加新視圖之前,將其綁定的代碼連接起來。
  3. 刪除舊視圖之前,斷開代碼中的綁定。

這應該讓一切都開心。

+0

謝謝!我認爲你在做某件事,但它仍然在做同樣的事情。我在原始問題帖子中添加了更多信息。 – 2009-11-28 19:00:10

+0

你在哪裏/如何得到* className *?這個很重要。你是否瀏覽過這段代碼,看它是否像預期的那樣行事? – 2009-11-28 19:22:41

+0

className不是問題,是的,我已經走了一步,一切都按預期行事。但它仍然拒絕工作。我能找到的唯一解決方案是通過編程方式控制哪些GUI元素顯示在主要的NIB中(從而消除了多個NIB)。這並不美觀,但現在必須做。 – 2009-12-02 23:07:18