错误NSObjectController对NSManagedObjectContext addObject的无效引用

时间:2014-05-28 23:44:11

标签: objective-c core-data nsmanagedobject cocoa-bindings nsobjectcontroller

问题:

我似乎没有设计时设置绑定或构建错误,但在运行时,找不到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

ObjectController设置

属性:mode = Entity Name,value = Account,prepares content = true,Editable = true
绑定;参数:绑定到App Delegate,controller key = null,model key path = managedObjectContext

TextField设置

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
)

2 个答案:

答案 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值绑定到任何内容,以便创建新帐户并让其显示在文本字段中。