【问题标题】:SelectionIndexes on NSArrayController return just a valueNSArrayController 上的 SelectionIndexes 只返回一个值
【发布时间】:2011-07-05 18:49:39
【问题描述】:

我有一个 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]) 我会得到这个

结果总是这样的

结束更新

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

我认为我在将 NSArrayController 与 NSCollectionView 绑定时做错了。什么是我的错? 如果您想了解更多信息,请告诉我,如果您需要,我什至可以将整个程序以 zip 的形式发布。

更新 2

这是我在控制器中用于观察 arrayController "selectionIndexes" 键的代码。

[arrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];

更新 3

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

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

更新 4

我试图在我的控制器的 init 方法中设置观察者,但这样 arrayController 仍然为空。在 awakeForNib 中移动 addObserver 解决了我所有的问题!

【问题讨论】:

  • 我现在删除了我的答案,因为问题不同,请发布您注册 KVO 的代码。
  • 更新了!现在你可以看到我是如何在 arrayController 上设置观察者的
  • 不!你能再解释一下吗?
  • 很好的答案!现在我可以手动获取 [arrayController selectedObjects] 中的选定项目列表。我刚刚更新了我的问题,我的最后一个问题是 selectionIndexes 更改时我没有收到通知。
  • 这正是我的问题!非常感谢,我将更新我的问题,以便对其他人有用。

标签: objective-c cocoa macos cocoa-bindings key-value-observing


【解决方案1】:

如果你想保持数组控制器的选择索引与集合视图的同步,你也需要绑定它们。总结:

  • 将集合视图Content绑定到数组控制器,键arrangedObjects
  • 将集合视图Selection Indexes绑定到数组控制器,键selectionIndexes

另外,请确保在添加观察者之前已设置 arrayController。出口保证设置在-awakeFromNib 和它之后调用的其他方法:如果你使用的是窗口控制器,你可以使用-windowDidLoad;如果你使用的是视图控制器,你可以使用-loadView;否则,-applicationDidFinishLaunching: 在您的应用程序委托中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2019-03-22
    • 2014-10-18
    • 2018-05-14
    相关资源
    最近更新 更多