NSArrayController初始化

CJ.*_*CJ. 7 macos cocoa core-data nib 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];
Run Code Online (Sandbox Code Playgroud)

当我尝试调用setSelectionIndex:时,它返回YES,表示选择已成功更改.但是,对pageArrayController对象的任何后续getSelectionIndex调用都返回NSNotFound.

我不明白的是,如果我将NSArrayController放入NIB,并允许NIB文件执行初始化(在Interface Builder中具有所有相同的属性),NSArrayController正常工作.

为什么行为存在差异?NIB文件是否以特殊方式初始化这些类型的对象?我的NSArrayController初始化是不正确的?

任何帮助表示赞赏.谢谢.

Eli*_*oij 15

是的,nibs以特殊方式初始化对象,有时很难弄清楚如何复制它.我也在努力解决这个问题,最后在Apple的核心数据编程指南>>核心数据和Cooca绑定中找到答案>> 自动准备内容标记(感谢Dave Fernandes在Cocoa Dev列表中).答案是,如果使用nil内容初始化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];
}
Run Code Online (Sandbox Code Playgroud)

BTW,[NSSortDescriptor sortDescriptorWithKey:@"index"升序:是]]发出警告.