我似乎没有设计时设置绑定或构建错误,但在运行时,找不到NSManagedObject(一个Account实体)的实例。我的配置错误是什么?
这是一个基本的介绍项目。通过使用XCode自动生成大多数MVC应用程序(不适用于iOS),我有一个“无代码”解决方案。 Xcode使用NSManagedObjectContext和MainMenu.xib生成了一个App Delegate。对于xib,我添加了一个NSObjectController,一个用于创建新实体的Button和一个TextField,用于编辑新创建的实体的实例上的值。我创建了数据模型,让XCode为我的实体生成NSManagedObjects,现在我只是设置绑定来连接M-V-C。
XIB的按钮 - > XIB的NSObjectController添加: - > AppDelegate的managedObjectContext
AppDelegate的managedObjectContext - > NSObjectController的selection.name - > XIB的TextField
绑定:已发送操作=添加: - > ObjectController
属性:mode = Entity Name,value = Account,prepares content = true,Editable = true
绑定;参数:绑定到App Delegate,controller key = null,model key path = managedObjectContext
Bindings:Bind To = Object Controller,Controller Key = selection,Model Key Path = name
设计时或构建期间没有错误,运行时错误日志如下。在单击按钮之前加载XIB时出现错误。单击按钮后出现相同的错误。当XIB加载时,我猜测TextField正在尝试获取空实体上的列。当我单击按钮时,我猜测TextField没有创建实例的句柄。
2014-05-28 16:09:11.526 BingoAppServer[2060:303] Cannot perform operation since entity with name 'Account' cannot be found
2014-05-28 16:09:11.529 BingoAppServer[2060:303] (
0 CoreFoundation 0x00007fff933da25c __exceptionPreprocess + 172
1 libobjc.A.dylib 0x00007fff98919e75 objc_exception_throw + 43
2 CoreFoundation 0x00007fff933da10c +[NSException raise:format:] + 204
3 AppKit 0x00007fff97020658 -[_NSManagedProxy _entity] + 141
4 AppKit 0x00007fff97020515 -[_NSManagedProxy fetchRequestWithSortDescriptors:limit:] + 95
5 AppKit 0x00007fff972708fb -[NSObjectController(NSManagedController) _executeFetch:didCommitSuccessfully:actionSender:] + 73
6 AppKit 0x00007fff9744b846 _NSSendCommitEditingSelector + 267
7 AppKit 0x00007fff970f4f78 -[NSController _controllerEditor:didCommit:contextInfo:] + 182
8 CoreFoundation 0x00007fff932c5a5c __invoking___ + 140
9 CoreFoundation 0x00007fff932c58c4 -[NSInvocation invoke] + 308
10 CoreFoundation 0x00007fff93368516 -[NSInvocation invokeWithTarget:] + 54
11 Foundation 0x00007fff934decb7 __NSFireDelayedPerform + 333
12 CoreFoundation 0x00007fff93341494 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
13 CoreFoundation 0x00007fff93340fcf __CFRunLoopDoTimer + 1151
14 CoreFoundation 0x00007fff933b25aa __CFRunLoopDoTimers + 298
15 CoreFoundation 0x00007fff932fc755 __CFRunLoopRun + 1525
16 CoreFoundation 0x00007fff932fbf25 CFRunLoopRunSpecific + 309
17 HIToolbox 0x00007fff8c772a0d RunCurrentEventLoopInMode + 226
18 HIToolbox 0x00007fff8c7727b7 ReceiveNextEventCommon + 479
19 HIToolbox 0x00007fff8c7725bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
20 AppKit 0x00007fff96cb326e _DPSNextEvent + 1434
21 AppKit 0x00007fff96cb28bb -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
22 AppKit 0x00007fff96ca69bc -[NSApplication run] + 553
23 AppKit 0x00007fff96c917a3 NSApplicationMain + 940
24 BingoAppServer 0x0000000100001252 main + 34
25 libdyld.dylib 0x00007fff915ec5fd start + 1
)
答案 0 :(得分:2)
这并不是说它找不到你想要的这个帐户 - 它告诉你它根本找不到你的托管对象模型中的帐户实体描述。检查以确保您使用的是正确的托管对象模型,并且它具有名为Account的实体。
答案 1 :(得分:1)
您的objectController
content
不应该绑定到managedObjectContext
。看起来发生的事情是您的对象控制器没有托管对象上下文集,这就是初始提取失败的原因。
你的对象控制器的绑定看起来应该更像:
objectController.entityName = @"Account";
objectController.automaticallyPreparesContrect = TRUE;
[objectController bind:@"managedObjectContext"
toObject:[NSApp delegate]
withKeyPath:@"managedObjectContext"
options:@{NSRaisesForNotApplicableKeysBindingOption : @(YES)
}];
button.target = objectController;
button.action = @selector(add:);
[textField bind:@"stringValue"
toObject:objectController
withKeyPath:@"selection.name"
options:@{NSConditionallySetsEditableBindingOption : @(YES),
NSNoSelectionPlaceholderBindingOption : @"No Selection"
/* etc... */
}];
您不能将managedObjectContext绑定到控制器的路径或值,而不是它的工作方式。在形式上,您不必将此objectControllers
值绑定到任何内容,以便创建新帐户并让其显示在文本字段中。