【问题标题】:NSArraycontroller selectionIndexes bindingsNSArraycontroller selectionIndexes 绑定
【发布时间】:2011-01-03 15:52:15
【问题描述】:

我有以下设置:

一个具有 splitView 的窗口,在该窗口中,我在左侧视图中显示 NSCollectionView,在右侧视图中显示 detailView。两个视图都设置在单独的 xib 中。此外,我有一个数据控制器(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?

非常感谢您的帮助! M

【问题讨论】:

    标签: cocoa-bindings nsarraycontroller key-value-observing


    【解决方案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 */
        }
    }
    

    【讨论】:

      【解决方案2】:

      很遗憾,没有人给出答案,或者我解释得不够好。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多