2011-09-29 27 views
0

我有一个简单的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]; 

}

当我通过这种方法设置音符和雇员之间的关系时,实际产生的异常的步骤(第三线)。

+0

“无法识别的选择器”并不意味着“你刚刚做的每件事都是错误的”;这意味着“你做的这个非常具体的事情是错误的”。确切的是,在剩下的消息中详细描述了这一点。请编辑您的问题以包含它。 –

+0

我已将堆栈跟踪添加到问题中。我已经尝试了几个选项来实现这个功能 - 还尝试将ArrayController绑定到notes属性。这没有奏效。 notes属性包含NSSet的一个实例,而ArrayController需要一个NSArray。另外,正如您在评论中指出的那样,显然不能将表直接绑定到数组。 – Roger

+0

从堆栈跟踪中,我猜你正在将一个数组控制器绑定到NSSet属性(这是IIRC,它是Core Data中的多对多关系)。确保你绑定了它的'contentSet',而不是它的'contentArray'。 –

回答

2

你需要的是一个NSArrayController,其内容绑定到关系上。然后,将NSTableView内容绑定到NSArrayController。从那里你可以做专栏。

UPDATE

tutorial from Apple可能会帮助你。

+2

您不绑定表格视图的内容。绑定列时会自动绑定。自己绑定表视图的内容会导致问题。 –

+0

感谢您提供本教程的链接。这非常有帮助! – Roger

+0

是啊!感谢您的教程! – Mikael

0

看来,我的问题描述的行为有事情做与具有基于文档的核心应用程序的日期或者具有“普通”核心数据的应用程序(支票,当你在Xcode中创建一个新的项目,你的地方)。

我发现,当我选择基于文件的核心数据的应用程序,不会出现上述问题。当我开发与非文档核心数据应用程序相同的应用程序时,绑定notes控制器会生成堆栈跟踪,如我原来的问题所示,并且只要向现有员工添加便笺,就会抛出异常。

因此,平心而论,这只是解决方案的一部分,因为我对Cocoa和XCode的体验不足以解释为什么它不能使用非文档变体。