NSArrayController初始化

时间:2009-12-07 15:46:11

标签: cocoa macos 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];

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

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

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

感谢任何帮助。感谢。

3 个答案:

答案 0 :(得分:15)

是的,nibs以特殊方式初始化对象,有时很难弄清楚如何复制它。我也在努力解决这个问题,最后在Apple的核心数据编程指南中找到答案>>核心数据和Cooca绑定>> Automatically Prepares Content Flag(感谢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];
}

BTW,[NSSortDescriptor sortDescriptorWithKey:@“index”升序:是]]发出警告。

答案 1 :(得分:0)

至于行为可能存在差异的原因:

  1. Nib文件使用NSCoder存储序列化对象。
  2. 您可能正在使用IB方面的绑定,在您的代码中,您使用set方法直接设置托管对象上下文。
  3. 也许您可以在代码中尝试以下内容:

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

    我没有Xcode附近,否则我会尝试一些事情。希望这能为您提供一些线索,让您朝着正确的方向前进。

答案 2 :(得分:0)

您从哪里创建/配置阵列控制器?核心数据堆栈可能还没有准备好,因此您对[self managedObjectContext]的调用可能会返回nil。

此外,如果您可以使用Interface Builder进行编程,为什么还要以编程方式创建它?该工具在那里工作良好(并消除了许多可能的编码错误),所以除非你有充分的理由不使用它,否则你不会给自己任何好处。