我有以下设置:
一个具有splitView的窗口,我在其中显示左视图中的NSCollectionView和右视图中的detailView。两个视图都在单独的xib中设置。此外,我有一个Datacontroller(类NSArrayController),它管理一个可变的NSMutableDictionaries数组(moviesForChoice)。 dataController被设置为应用程序委托。数组中的影片对象具有(名称,情节,类型等)
等属性到目前为止一直很好......
在NScollectionview的xib中,我通过Application.delegate.moviesForChoice将NSArraycontroller内容属性绑定到我的datacontroller.collectionView访问arraycontroller.arrrangedObjects和arraycontroller.selectionIndexes。这样可以正常显示内容并且选择在collectionview中正常工作(我的collectionviewItem呈现选择颜色)
在detailView的xib中,我想在collectionview中显示所选对象的信息。因此,我还向xib添加了一个arraycontroller,将内容aray绑定到Application.delegate.moviesForChoice,并将视图中的NSTextfield绑定到例如arraycontroller.selection.name
我的问题出现了: 每当我用两个xib打开窗口时,我的collectionview会显示所有正确选择的电影,而detailview会在我的collectionview中显示第一个对象的信息。每当我点击集合中的另一部电影时,请查看res。 item呈现选择颜色,但detailView不会更新。
我对它的理解是DataController没有被告知selectionIndexes中的更新,因此不能触发detailView中的更新。如果我错了,请纠正我......
为了解决这个问题,我尝试将collectionView xib中arraycontroller的selectionIndexes属性绑定到Application.delegate.moviesForChoice.selecionIndexes但是这个失败了: addObserver:forKeyPath:options:context:]不受支持。关键路径:selectionIndexes
我可以想象这意味着datacontroller与我的Array moviesForChoice不符合KVO,但是我实现了以下方法:
-(void)insertObject:(NSDictionary *)dict inMoviesForChoiceAtIndex:(NSUInteger)index {
[moviesForChoice insertObject:dict atIndex:index];
}
-(void)removeObjectFromMoviesForChoiceAtIndex:(NSUInteger)index {
[moviesForChoice removeObjectAtIndex:index];
}
-(void)setMoviesForChoice:(NSMutableArray *)a {
moviesForChoice = a;
}
-(NSArray*)moviesForChoice {
return moviesForChoice;
}
-(NSUInteger)countOfMoviesForChoice
{
return [moviesForChoice count];
}
- (void)addMovieForChoiceObject:(Movie *)anObject
{
[moviesForChoice addObject:anObject];
}
那我在哪里错了?如何正确绑定到selectionIndexes?
非常感谢您的帮助! 中号
答案 0 :(得分:1)
一种处理选择更新的聪明方法是添加一个中间对象,它只会根据选择进行更新,即在您的情况下,我会在前一个“界面构建器”中创建一个绑定到当前所选对象的中间“对象控制器” 。然后,必须将当前所选对象的所有相关信息绑定到该单个对象实例(在更改时应包括自动更新)。 这说我也经历过这样一种情况:由于没有明显的原因,接口objet确实加载了但是相关的绑定项没有...(=没有更新),在这种情况下,一个非常好的解决方案是与观察者一起工作来捕获泛型动作而不是处理每个对象点击分配。典型的操作是selectionIndex的更改。
[listArrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];
然后在你的课堂上:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
/* DO STUFF HERE LIKE BINDING THE OBJECT TO THE CURRENT SELECTION */
}
}
答案 1 :(得分:0)
不幸的是,没有人得到答案,或者我没有给自己解释得足够好。
所以我在dataController中引入了一个新变量,只要点击它就会被collectionViewItem填充,我将detailview绑定到变量中的对象。
这是手册,我知道,但它可以解决问题。
如果有人想出更好的答案,请随时分享。我很感激。