我有以下设置:
一个具有splitView的窗口,在该窗口中,我在左视图中显示I NSCollectionView,在右视图中显示一个detailView。这两个视图都设置在单独的xibs中。此外,我有一个数据控制器(属于NSArrayController类),它管理一个可变的NSMutableDictionaries数组(moviesForChoice)。dataController被设置为应用程序委托。数组中的电影对象具有如下属性(名称、情节、流派等)
到目前为止一切顺利..。
在NScollectionview的xib中,我通过Application.delegate.moviesForChoice将NSArraycontroller内容属性绑定到我的数据控制器,collectionView访问arraycontroller.arrrangedObjects和arraycontroller.selectionIndexes。这样可以很好地显示内容,并且在集合视图中选择也可以很好地工作(我的collectionviewItem会呈现一种选择颜色)。
在detailView的xib中,我想在集合视图中显示所选对象的信息。因此,我还向xib添加了一个arraycontroller,将内容aray绑定到Application.delegate.moviesForChoice,并将视图中的NSTextfields绑定到例如arraycontroller.selection.name
我的问题来了:每次我打开带有两个xib的窗口时,我的集合视图都会正确地显示所有可供选择的电影,而详细视图则显示我的集合视图中第一个对象的信息。每当我在collectionView中点击不同的电影时,res。item呈现选择颜色,但detailView不更新。
我对此的理解是,DataController不会被告知selectionIndexes中的更新,因此不能触发detailView中的更新。如果我说错了请纠正我。
为了纠正这个问题,我尝试将collectionView xib中的arraycontroller的selectionIndexes属性绑定到Application.delegate.moviesForChoice.selecionIndexes,但失败了,错误为: addObserver:forKeyPath:options:context:]不受支持。关键路径: selectionIndexes
我可以想象这意味着数据控制器对于我的数组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?
非常感谢您的帮助!我
发布于 2011-01-14 19:49:58
不幸的是,没有人有答案,或者我没有很好地解释自己。
因此,我在dataController中引入了一个新变量,每当单击该变量时,collectionViewItem都会填充该变量,并将详细视图绑定到该变量中的对象。
这是手动的,我知道,但它确实起作用了。
如果有人想出更好的答案,请随时分享。我会很感激的。
发布于 2011-09-14 17:22:35
处理选择更新的一个聪明的方法是添加一个中间对象,它只会随着选择而更新。在你的例子中,我会在以前的“接口构建器”中创建一个绑定到当前所选对象的中间“对象控制器”。那么与当前选择的object相关的所有信息都必须绑定到这个单一的对象实例(它应该包括更改时的自动更新)。也就是说,我也遇到过这样的情况,没有明显的原因,接口对象确实加载了,但相关的绑定项没有…(=未更新),在这种情况下,一个很好的解决方案是使用观察者来捕获通用操作,而不是处理每次对象单击的赋值。一个典型的动作是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 */
}
}https://stackoverflow.com/questions/4585913
复制相似问题