我在让核心数据支持的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初始化有误吗?
任何帮助都是非常感谢的。谢谢。
发布于 2009-12-08 04:25:36
是的,nibs确实以一种特殊的方式初始化对象,有时很难弄清楚如何复制它。我也为此而苦苦挣扎,最终在苹果的核心数据编程指南>>核心数据和Cooca Bindings >> Automatically Prepares Content Flag中找到了答案(感谢Cocoa Dev列表中的Dave Fernandes )。答案是,如果您初始化一个包含nil内容的arraycontroller,您还需要执行一次fetch。
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:@“索引”升序:是]会发出警告。
发布于 2009-12-08 00:13:00
至于为什么会有行为上的差异:
也许您可以在您的代码中尝试类似以下内容:
[pageArrayController bind:@"managedObjectContext"
toObject:self
withKeyPath:@"managedObjectContext"
options:nil];我没有Xcode在附近,否则我会尝试一些东西。希望这能给你一些线索,让你朝着正确的方向前进。
发布于 2009-12-08 04:24:07
您从何处创建/配置阵列控制器?核心数据堆栈可能还没有准备好,因此对self managedObjectContext的调用可能会返回nil。
另外,如果使用Interface Builder就可以做到这一点,为什么还要通过编程来创建它呢?该工具已经存在并且运行良好(并且消除了许多可能的编码错误),所以除非您有充分的理由不使用它,否则您不会给自己带来任何好处。
https://stackoverflow.com/questions/1860805
复制相似问题