我想使用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'中的模塊錯誤,正如我們所看到的那樣,它不是不可能的。 –