我想使用NSArrayController
和NSTableView
来允许多选,但只有在选择单个对象时才提供选定的对象(并且当选择一个或多个对象时为nil
) 。为什么我的KVO依赖项在NSArrayController中不起作用
我已经尝试与NSArrayController
类别来实现这一点,如下所示:
@implementation NSArrayController (SelectedObject)
+ (NSSet *)keyPathsForValuesAffectingSelectedObject {
return [NSSet setWithObject:@"selection"];
}
- (id)selectedObject {
// Get the actual selected object (or nil) instead of a proxy.
if (self.selectionIndexes.count == 1) {
return [self arrangedObjects][self.selectionIndex];
}
return nil;
}
@end
出于某种原因,selectedObject
方法不调用时的阵列控制器改变选择(和别的东西正在观察selectedObject
)。为什么是这样?
在'-awakeFromNib'中添加自我观察看起来并不完全可靠。为什么不重写'-initWithContent:'?在'-observeValueForKeyPath:...'中,如果上下文是你的,不要通过超级调用。使'kObservingSelectionIndexesContext''NSString * const'。在基础属性已经改变之后执行'willChange ...'是不安全/可靠的。使用'NSKeyValueObservingOptionPrior',并根据“change”是否包含“NSKeyValueChangeNotificationIsPriorKey”调用'willChange ...'或'didChange ...'。这就是它的目的。 –
是否保证'initWithContent'始终被调用?如果它是用'initWithCoder:'初始化的呢?此外,它看起来像NSKeyValueObservingOptionPrior [不适用于NSArrayController](https://lists.apple.com/archives/Cocoa-dev/2010/Apr/msg00092.html)([radar](https:// openradar。 appspot.com/7834918))。 – DanielGibbs
'-initWithContent:'是'NSObjectController'的指定初始值,'NSArrayController'从其继承。 'NSArrayController'不声明一个新的指定初始化器。所有其他初始化器都必须通过指定的初始化器以良好行为的类进行路由。所以,是的,它确保了'NSArrayController'或'NSObjectController'中的模块错误,正如我们所看到的那样,它不是不可能的。 –