我有一个简单的Core Data应用程序,用于建模对象:employee和notes。员工可以有许多笔记(1:很多),每个笔记属于一名员工(1:1)。在员工窗口中,我使用NSArrayController显示了文件中员工的列表(NSTableView)。点击员工在列表旁边显示他们的详细信息(姓名地址,性别等)。现在,我还想显示选定员工的文件备注列表(也是NSTableView)。该列表应显示文件中每个音符的2个属性:其主题及其录入日期)。 (1)将表的日期列绑定到Employee控制器,控制器键:选择,模型键路径:notes.date(2)绑定Employee控制器的主题列,控制器密钥:选择,模型关键路径:notes.topic如何在界面生成器中绑定1:多关系
然而,这将抛出异常(无法识别的选择)。
如何正确地将雇员的notes属性绑定到NSTableView?可以在IB中使用可可绑定“直接”完成,还是在设置绑定之前访问员工的notes属性所需的额外代码?我检查了由Core Data编写的数据,这看起来很不错。
非常感谢您的帮助...
编辑:这里是从调试器堆栈跟踪...
2011-09-30 00:46:56.010 EmployeeDemo[3843:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x10260b9c0' *** First throw call stack: ( 0 CoreFoundation 0x00007fff8c654986 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff8b040d5e objc_exception_throw + 43 2 CoreFoundation 0x00007fff8c6e05ae -[NSObject doesNotRecognizeSelector:] + 190 3 CoreFoundation 0x00007fff8c641803 ___forwarding___ + 371 4 CoreFoundation 0x00007fff8c641618 _CF_forwarding_prep_0 + 232 5 AppKit 0x00007fff87c72648 -[NSTableBinder _visibleRowIndexesForObject:] + 267 6 AppKit 0x00007fff87c72291 -[NSTableBinder observeValueForKeyPath:ofObject:change:context:] + 131 7 Foundation 0x00007fff8dbb818a NSKeyValueNotifyObserver + 387 8 Foundation 0x00007fff8dbb21af -[NSObject(NSKeyValueObservingPrivate) _notifyObserversForKeyPath:change:] + 756 9 AppKit 0x00007fff876f1f0b -[NSController _notifyObserversForKeyPath:change:] + 206 10 AppKit 0x00007fff877fc5fc -[NSController observeValueForKeyPath:ofObject:change:context:] + 847 11 AppKit 0x00007fff879a1cf9 -[NSArrayController observeValueForKeyPath:ofObject:change:context:] + 98 12 Foundation 0x00007fff8dbb818a NSKeyValueNotifyObserver + 387 13 Foundation 0x00007fff8dbd9387 NSKeyValueDidChange + 486 14 Foundation 0x00007fff8dc6834b -[NSObject(NSKeyValueObservingPrivate) _didChangeValuesForKeys:] + 631 15 CoreData 0x00007fff8e827543 _PFFaultHandlerFulfillFault + 3619 16 CoreData 0x00007fff8e825bd8 _PFFaultHandlerLookupRow + 1592 17 CoreData 0x00007fff8e825254 _PF_FulfillDeferredFault + 212 18 CoreData 0x00007fff8e8250d8 _sharedIMPL_pvfk_core + 56 19 CoreData 0x00007fff8e85bd3e -[NSManagedObject valueForKey:] + 222 20 Foundation 0x00007fff8dbb479e -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 348 21 AppKit 0x00007fff8799ded5 -[NSArrayController _multipleValueForKeyPath:atIndex:] + 84 22 AppKit 0x00007fff8799cfc9 -[NSArrayController _singleValueForKeyPath:] + 151 23 AppKit 0x00007fff87704cfe -[_NSControllerObjectProxy valueForKeyPath:] + 77 24 Foundation 0x00007fff8dbb4761 -[NSObject(NSKeyValueCoding) valueForKeyPath:] + 287 25 AppKit 0x00007fff87704baa -[NSBinder _valueForKeyPath:ofObject:mode:raisesForNotApplicableKeys:] + 654 26 AppKit 0x00007fff87704894 -[NSBinder valueForBinding:resolveMarkersToPlaceholders:] + 171 27 AppKit 0x00007fff87907352 -[NSValueBinder _referenceBindingValue] + 31 28 AppKit 0x00007fff87907163 -[NSValueBinder _adjustObject:mode:observedController:observedKeyPath:context:editableState:adjustState:] + 647 29 AppKit 0x00007fff87906e48 -[NSValueBinder _observeValueForKeyPath:ofObject:context:] + 303 30 AppKit 0x00007fff8791ed0b -[NSTextValueBinder _observeValueForKeyPath:ofObject:context:] + 43 31 Foundation 0x00007fff8dbb818a NSKeyValueNotifyObserver + 387 32 Foundation 0x00007fff8dbb21af -[NSObject(NSKeyValueObservingPrivate) _notifyObserversForKeyPath:change:] + 756 33 AppKit 0x00007fff876f1f0b -[NSController _notifyObserversForKeyPath:change:] + 206 34 AppKit 0x00007fff8795e7a5 -[NSArrayController didChangeValuesForArrangedKeys:objectKeys:indexKeys:] + 120 35 AppKit 0x00007fff879601bd -[NSArrayController setContent:] + 870 36 AppKit 0x00007fff879a2664 -[NSArrayController(NSManagedController) _performFetchWithRequest:merge:error:] + 370 37 AppKit 0x00007fff87bb149e -[NSObjectController(NSManagedController) fetchWithRequest:merge:error:] + 177 38 AppKit 0x00007fff87bb1522 -[NSObjectController(NSManagedController) _executeFetch:didCommitSuccessfully:actionSender:] + 92 39 AppKit 0x00007fff87d932e7 _NSSendCommitEditingSelector + 30 40 AppKit 0x00007fff87a50246 -[NSController _controllerEditor:didCommit:contextInfo:] + 188 41 libdispatch.dylib 0x00007fff847df90a _dispatch_call_block_and_release + 18 42 libdispatch.dylib 0x00007fff847e177a _dispatch_main_queue_callback_4CF + 308 43 CoreFoundation 0x00007fff8c5e9c0c __CFRunLoopRun + 1724 44 CoreFoundation 0x00007fff8c5e9216 CFRunLoopRunSpecific + 230 45 HIToolbox 0x00007fff871924ff RunCurrentEventLoopInMode + 277 46 HIToolbox 0x00007fff87199c21 ReceiveNextEventCommon + 355 47 HIToolbox 0x00007fff87199aae BlockUntilNextEventMatchingListInMode + 62 48 AppKit 0x00007fff876de191 _DPSNextEvent + 659 49 AppKit 0x00007fff876dda95 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135 50 AppKit 0x00007fff876da3d6 -[NSApplication run] + 463 51 AppKit 0x00007fff8795852a NSApplicationMain + 867 52 EmployeeDemo 0x0000000100001a62 main + 34 53 EmployeeDemo 0x0000000100001a34 start + 52 ) terminate called throwing an exception
编辑2:
似乎有另一个与底层模型有关的问题。员工的笔记通过单独的窗口输入,并带有自己的控制器。它创建新的笔记并允许用户设置其属性(主题,正文)。当用户按下“保存”按钮时,执行该saveNote方法:
- (IBAction)saveNote:(id)sender {
[[self note] setValue: [[self topicField] stringValue] forKey: @"topic"];
[[self note] setValue: [[self textView] string] forKey: @"bodyText"];
[[self note] setValue: [self employee] forKey: @"employee"];
NSError *error = nil;
if (![[self managedObjectContext] save:&error]) {
//todo: add proper error handling
NSLog(@"An error occurred while trying to save the memo");
}
[[self window] close];
}
当我通过这种方法设置音符和雇员之间的关系时,实际产生的异常的步骤(第三线)。
“无法识别的选择器”并不意味着“你刚刚做的每件事都是错误的”;这意味着“你做的这个非常具体的事情是错误的”。确切的是,在剩下的消息中详细描述了这一点。请编辑您的问题以包含它。 –
我已将堆栈跟踪添加到问题中。我已经尝试了几个选项来实现这个功能 - 还尝试将ArrayController绑定到notes属性。这没有奏效。 notes属性包含NSSet的一个实例,而ArrayController需要一个NSArray。另外,正如您在评论中指出的那样,显然不能将表直接绑定到数组。 – Roger
从堆栈跟踪中,我猜你正在将一个数组控制器绑定到NSSet属性(这是IIRC,它是Core Data中的多对多关系)。确保你绑定了它的'contentSet',而不是它的'contentArray'。 –