蘋果有一個很好的教程來製作一個簡單的主從接口。 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];
}
}
這實際上無關與核心數據 - 刪除該標籤,這現在。 – 2009-11-28 14:44:06