2009-12-07 48 views
7

我無法讓核心數據支持的NSArrayController在我的代碼中正常工作。以下是我的代碼:NSArrayController初始化

pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
    [pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
    [pageArrayController setEntityName:@"Page"]; 
    [pageArrayController setAvoidsEmptySelection:YES]; 
    [pageArrayController setPreservesSelection:YES]; 
    [pageArrayController setSelectsInsertedObjects:YES]; 
    [pageArrayController setClearsFilterPredicateOnInsertion:YES]; 
    [pageArrayController setEditable:YES]; 
    [pageArrayController setAutomaticallyPreparesContent:YES]; 
    [pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]]; 
    BOOL result = [pageArrayController setSelectionIndex:0]; 

當我嘗試調用setSelectionIndex時,它返回YES,表示選擇已成功更改。但是,對pageArrayController對象的任何後續getSelectionIndex調用都會返回NSNotFound。

我不明白的是,如果我把NSArrayController的成NIB,並允許NIB文件進行初始化(所有在Interface Builder中相同的屬性),NSArrayController的正常工作。

爲什麼行爲有差異? NIB文件是否以特殊方式初始化這些類型的對象?我的NSArrayController初始化不正確?

任何幫助表示讚賞。謝謝。

+0

沒有'-getSelectionIndex'方法。你自己寫了這樣一個方法,還是實際調用了一些不同的東西? – 2009-12-08 00:23:14

+0

我的意思是-selectionIndex。 – 2009-12-08 14:27:02

回答

14

是的,筆尖會以特殊的方式初始化對象,有時很難弄清楚如何複製它。我也爲此苦苦掙扎,終於在Apple的Core Data編程指南>> Core Data和Cooca Bindings >>Automatically Prepares Content Flag(感謝Dave Fernandes的Cocoa Dev列表)中找到答案。答案是,如果你初始化一個沒有內容的arraycontroller,你也需要執行一次提取。

BOOL result; 
NSArrayController *pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
[pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
[pageArrayController setEntityName:@"Page"]; 
NSError *error; 
if ([pageArrayController fetchWithRequest:nil merge:YES error:&error] == NO) 
    result = NO; 
else 
{ 
    //do all that other pageArrayController configuration stuff 
    result = [pageArrayController setSelectionIndex:0]; 
} 

順便說一句,[NSSortDescriptor sortDescriptorWithKey:@ 「索引」 升序:YES]]提出警告。

+0

此外,您使用[self managedObjectContext]暗示您已將您的pageArrayController方法添加到appDelegate。這不被認爲是好的做法。您真的應該考慮創建一個單獨的頁面控制器對象(以及實現MVC模式所需的模型和視圖對象),以便處理應用程序的整個頁面功能。頁面控制器或頁面模型對象可能在必要時調用[[NSApp委託] managedObjectContext]。 – 2009-12-11 14:08:13

+0

感謝這個解決方案,它完美的工作。我的應用程序結構現在好多了,我可以用代碼創建這些數組控制器,而不是依賴於筆尖。 – 2010-02-17 18:47:34

+0

你我的朋友,是一個傳奇!我花了好幾天的時間試圖找出爲什麼我的數組控制器沒有更新,因爲新數據從iCloud進入我的Core Data存儲庫。現在它完美地工作。謝謝。 – Fin 2012-11-09 20:28:19

0

至於爲什麼有可能是行爲上的差異:

  1. 筆尖文件存儲使用NSCoder序列化對象。
  2. 您可能正在使用綁定在事物的IB方面,在您的代碼中您直接使用set方法設置託管對象上下文。

也許你可以嘗試像在你的代碼如下:

[pageArrayController bind:@"managedObjectContext" 
       toObject:self 
       withKeyPath:@"managedObjectContext" 
        options:nil]; 

我沒有Xcode的附近,否則我會嘗試出頭。希望這給你一些線索,讓你朝着正確的方向前進。

0

從哪裏創建/配置陣列控制器?核心數據堆棧可能尚未準備好,因此您對[self managedObjectContext]的調用可能會返回nil。

另外,你爲什麼以編程方式創建它,如果你可以用界面生成器來做到這一點?該工具在那裏並且運行良好(並且消除了許多可能的編碼錯誤),所以除非你有充分的理由不使用它,否則你沒有做任何好處。

+0

在我的情況下,我在代碼中創建NSArrayController,因爲在使用IB時,NSArrayController中的綁定數據尚未加載到'awakeFromNib'方法中。 你知道如何解決IB中的問題嗎? – xyz 2012-02-21 08:00:34