Cocoa bindings NSArraycontroller选择索引绑定

Cocoa bindings NSArraycontroller选择索引绑定,cocoa-bindings,nsarraycontroller,key-value-observing,Cocoa Bindings,Nsarraycontroller,Key Value Observing,我有以下设置: 具有拆分视图的窗口,其中在左视图中显示I NSCollectionView,在右视图中显示detailView。两个视图都在单独的XIB中设置。此外,我还有一个Datacontroller(属于NSArrayController类),它管理NSMutableDictionary(moviesForChoice)的可变数组。dataController设置为应用程序委托。数组中的电影对象具有以下属性(名称、情节、流派等) 到目前为止还不错 在NScollectionview的xib

我有以下设置:

具有拆分视图的窗口,其中在左视图中显示I NSCollectionView,在右视图中显示detailView。两个视图都在单独的XIB中设置。此外,我还有一个Datacontroller(属于NSArrayController类),它管理NSMutableDictionary(moviesForChoice)的可变数组。dataController设置为应用程序委托。数组中的电影对象具有以下属性(名称、情节、流派等)

到目前为止还不错

在NScollectionview的xib中,我通过Application.delegate.Movies将NSArraycontroller内容属性绑定到我的datacontroller。collectionView可访问arraycontroller.arrrangedObjects和arraycontroller.SelectionIndex。此操作在collectionview(我的collectionviewItem渲染选择颜色)中显示内容和选择效果良好

在detailView的xib中,我想在collectionview中显示所选对象的信息。因此,我还向xib添加了一个arraycontroller,将内容aray绑定到Application.delegate.moviesForChoice,并将视图中的NSTextfields绑定到例如arraycontroller.selection.name

我的问题来了: 每次我用两个XIB打开窗口时,我的collectionview都会显示供正确选择的所有影片,而detailview会显示我的collectionview中第一个对象的信息。每当我在collectionView中单击不同的电影时,res.项会呈现选择颜色,但detailView不会更新

据我所知,DataController不会被告知SelectionIndex中的更新,因此无法触发detailView中的更新。如果我错了,请纠正我

为了解决此问题,我尝试将collectionView xib中arraycontroller的SelectionIndex属性绑定到Application.delegate.moviesForChoice.SelectionIndex,但由于以下原因失败: 不支持addObserver:forKeyPath:options:context:]。关键路径:选择索引

我可以想象这意味着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];
}
那么我错在哪里呢?如何正确绑定到SelectionIndex

非常感谢你的帮助!
不幸的是,没有人有答案,或者我没有很好地解释自己

因此,我在dataController中引入了一个新变量,每当单击collectionViewItem时该变量都会被填充,并且我将detailview绑定到变量中的对象

这是手动的,我知道,但它能起作用


如果有人能想出更好的答案,欢迎分享。非常感谢。

处理选择更新的一个聪明方法是添加一个仅随选择更新的中间对象,即在您的情况下,我会在以前的“界面生成器”中创建一个绑定到当前选定对象的中间“对象控制器”。然后,所有与当前所选对象相关的信息都必须绑定到此单个对象实例(该实例应包括更改时的自动更新)。 也就是说,我也经历过这样的情况,没有明显的原因,接口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 */
    }
}