我有一个NSCollectionView,其中的内容是由NSArrayController处理的。
NSCollectionView是可选的,我需要检索所选元素的列表。
我正在尝试观察NSArrayController“selectionIndexes”的关键属性,但它总是返回给我,始终是CollectionView中第一个元素的值,而不是所选项目。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        //True if in the array controller of the collection view really exists at least a selected object
        if([[arrayController selectedObjects] count] > 0)
        {
            NSLog(@"Selected objects: %@", [arrayController selectedObjects]);
        }
        else
        {
            NSLog(@"Observer called but no objects where selected.");
        }
    }
}

更新

如果我手动调用NSLog(@“Selected objects:%@”,[arrayController selectedObjects]),我永远不会得到此方法的调用

结果总是这样

END UPDATE
2011-07-05 20:44:45.711 collectionView2[2153:903] Selected objects 1: (
    "<Hormiga: 0x10013e330>"
)

我认为我将NSArrayController与NSCollectionView绑定(bind)时做错了。可能是我的错吗?
告诉我是否需要更多信息,如果需要,我甚至可以将整个程序发布为zip。

更新2

这是我在 Controller 中用来观察arrayController“selectionIndexes”键的代码。
[arrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];

更新3

解决了问题之一,我忘记设置相对于键“selectionIndexes”的NSArrayController和NSCollectionView之间的绑定(bind)。现在,我可以手动检索selectedObject及其正确的列表!

我的最后一个问题是,当selectionIndexes更改时,我没有收到通知。
因此,observeValueForKeyPath:ofObject:change:context:永远不会被调用!

更新4

我试图在 Controller 的init方法中设置观察者,但是以这种方式,arrayController仍然为null。在awakeForNib中移动addObserver解决了我所有的问题!

最佳答案

如果要使阵列 Controller 的选择索引与集合 View 的同步,则还需要绑定(bind)它们。总之:

  • 将集合 View Content绑定(bind)到阵列 Controller ,键arrangedObjects
  • 将集合 View Selection Indexes绑定(bind)到阵列 Controller ,键selectionIndexes

  • 另外,在添加观察者之前,请确保已设置arrayController。可以确保使用-awakeFromNib及其后调用的其他方法来设置 socket :如果您使用的是窗口 Controller ,则可以使用-windowDidLoad;如果您使用的是 View Controller ,则可以使用-loadView;否则,请在您的应用程序委托(delegate)中添加-applicationDidFinishLaunching:

    09-07 14:09