0

问题:

我似乎在没有设计时或构建错误的情况下设置了绑定,但在运行时找不到 NSManagedObject(帐户实体)的实例。我的配置错误是什么?

配置:

这是一个基本的介绍项目。通过使用 XCode 自动生成大部分 MVC 应用程序(不适用于 iOS),我得到了一个“无代码”解决方案。Xcode 使用 NSManagedObjectContext 和 MainMenu.xib 生成了一个 App Delegate。在 xib 中,我添加了一个 NSObjectController、一个用于创建新实体的 Button 和一个用于编辑新创建实体实例上的值的 TextField。我创建了数据模型,让 XCode 为我的实体生成 NSManagedObjects,现在我只是设置绑定来连接 MVC。

概念绑定流程:

XIB 的 Button -> XIB 的 NSObjectController 添加: -> AppDelegate 的 managedObjectContext
AppDelegate 的 managedObjectContext -> NSObjectController 的 selection.name -> XIB 的 TextField

按钮设置

绑定:Sent Actions = 添加:--> ObjectController

对象控制器设置

属性:mode = Entity Name,value = Account,prepare content = true,Editable = true
Bindings;参数:绑定到 App Delegate,控制器键 = null,模型键路径 = managedObjectContext

文本字段设置

绑定:绑定到 = 对象控制器,控制器键 = 选择,模型键路径 = 名称

问题:

在设计时或构建期间没有错误,运行时错误日志如下。在单击按钮之前加载 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
)
4

2 回答 2

2

并不是说它找不到您想要的 Account — 它告诉您它根本无法在您的托管对象模型中找到 Account 实体描述。检查以确保您使用的是正确的托管对象模型,并且它有一个名为 Account 的实体。

于 2014-05-28T23:50:11.633 回答
1

objectController的 'scontent不应该绑定到 a 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值绑定到任何东西以创建一个新帐户并将其道具显示在文本字段中。

于 2014-05-29T01:29:18.707 回答