首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSArrayController初始化

NSArrayController初始化
EN

Stack Overflow用户
提问于 2009-12-07 23:46:11
回答 3查看 4.5K关注 0票数 8

我在让核心数据支持的NSArrayController在我的代码中正常工作时遇到了麻烦。下面是我的代码:

代码语言:javascript
复制
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初始化有误吗?

任何帮助都是非常感谢的。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-08 04:25:36

是的,nibs确实以一种特殊的方式初始化对象,有时很难弄清楚如何复制它。我也为此而苦苦挣扎,最终在苹果的核心数据编程指南>>核心数据和Cooca Bindings >> Automatically Prepares Content Flag中找到了答案(感谢Cocoa Dev列表中的Dave Fernandes )。答案是,如果您初始化一个包含nil内容的arraycontroller,您还需要执行一次fetch。

代码语言:javascript
复制
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:@“索引”升序:是]会发出警告。

票数 16
EN

Stack Overflow用户

发布于 2009-12-08 00:13:00

至于为什么会有行为上的差异:

  1. Nib文件使用NSCoder存储序列化对象。
  2. 您可能在IB端使用绑定,在代码中使用set方法直接设置托管对象上下文。

也许您可以在您的代码中尝试类似以下内容:

代码语言:javascript
复制
[pageArrayController bind:@"managedObjectContext"
                 toObject:self
              withKeyPath:@"managedObjectContext"
                  options:nil];

我没有Xcode在附近,否则我会尝试一些东西。希望这能给你一些线索,让你朝着正确的方向前进。

票数 0
EN

Stack Overflow用户

发布于 2009-12-08 04:24:07

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

另外,如果使用Interface Builder就可以做到这一点,为什么还要通过编程来创建它呢?该工具已经存在并且运行良好(并且消除了许多可能的编码错误),所以除非您有充分的理由不使用它,否则您不会给自己带来任何好处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1860805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档