首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSArraycontroller selectionIndexes绑定

NSArraycontroller selectionIndexes绑定
EN

Stack Overflow用户
提问于 2011-01-03 23:52:15
回答 2查看 1.7K关注 0票数 2

我有以下设置:

一个具有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兼容的,但是我为它实现了以下方法:

代码语言:javascript
复制
  -(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?

非常感谢您的帮助!我

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-14 19:49:58

不幸的是,没有人有答案,或者我没有很好地解释自己。

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

这是手动的,我知道,但它确实起作用了。

如果有人想出更好的答案,请随时分享。我会很感激的。

票数 0
EN

Stack Overflow用户

发布于 2011-09-14 17:22:35

处理选择更新的一个聪明的方法是添加一个中间对象,它只会随着选择而更新。在你的例子中,我会在以前的“接口构建器”中创建一个绑定到当前所选对象的中间“对象控制器”。那么与当前选择的object相关的所有信息都必须绑定到这个单一的对象实例(它应该包括更改时的自动更新)。也就是说,我也遇到过这样的情况,没有明显的原因,接口对象确实加载了,但相关的绑定项没有…(=未更新),在这种情况下,一个很好的解决方案是使用观察者来捕获通用操作,而不是处理每次对象单击的赋值。一个典型的动作是selectionIndex的改变。

代码语言:javascript
复制
[listArrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];  

然后在你的班上:

代码语言:javascript
复制
 - (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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4585913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档