2

我有以下设置:

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

到目前为止,一切都很好...

在 NScollectionview 的 xib 中,我通过 Application.delegate.movi​​esForChoice 将 NSArraycontroller 内容属性绑定到我的数据控制器。collectionView 访问 arraycontroller.arrrangedObjects 和 arraycontroller.selectionIndexes。这工作正常,内容显示和选择在 collectionview 中工作正常(我的 collectionviewItem 呈现选择颜色)

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

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

我对它的理解是 DataController 不知道 selectionIndexes 中的更新,因此不能触发 detailView 中的更新。如我错了请纠正我...

为了解决这个问题,我尝试将 collectionView xib 中 arraycontroller 的 selectionIndexes 属性绑定到 Application.delegate.movi​​esForChoice.selecionIndexes 但这失败了:不支持 addObserver:forKeyPath:options:context:]。关键路径:selectionIndexes

我可以想象这意味着数据控制器不符合我的 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?

非常感谢您的帮助!米

4

2 回答 2

1

处理选择更新的一个聪明方法是添加一个中间对象,该对象将仅通过选择进行更新,即在您的情况下,我将在前一个“界面构建器”中创建一个绑定到当前选定对象的中间“对象控制器”。然后,与当前选定对象的所有相关信息都必须绑定到这个单个对象实例(它应该包括在更改时自动更新)。这就是说我也遇到过这样的情况,没有明显的原因,接口对象确实加载了,但相关的绑定项目没有……(=没有更新),在这种情况下,一个很好的解决方案是与观察者一起捕捉通用动作而不是处理每个对象单击分配。一个典型的动作是 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 */
    }
}
于 2011-09-14T09:22:34.753 回答
0

不幸的是,没有人给出答案,或者我解释得不够好。

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

它是手动的,我知道,但它可以解决问题。

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

于 2011-01-14T11:49:58.400 回答