【发布时间】: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