好的,所以我设置了一个NSTableView
绑定到NSArrayController
。
现在,我还有一个NSButton
,当 选择时,我想让它“启用”,当没有选择时,我会禁用它。
所以,我绑定NSButton
已启用数组控制器的selection
,其值变换为NSIsNotNil
。
然而,它似乎没有起作用。
我错过了什么吗?
答案 0 :(得分:4)
无论是否选择了任何内容,selection
的{{1}}属性都会返回一个对象(NSArrayController
)。这就是为什么你的绑定没有按照你期望的方式工作的原因,因为_NSControllerProxyObject
永远不会是selection
。相反,我绑定到nil
而不是selectionIndexes
,并且有一个名为selection
的值转换器,如下所示:
SelectionIndexesCountIsZero
顺便提一下,如果您愿意,仍然可以绑定到@interface SelectionIndexesCountIsZero : NSValueTransformer
@end
@implementation SelectionIndexesCountIsZero
+ (Class)transformedValueClass { return [NSNumber class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(NSIndexSet *)value { return [NSNumber numberWithBool:[value count] > 0]; }
@end
,但它需要自定义值转换器。 Apple声明:如果使用键值编码从选择代理[对象]请求的值返回多个对象,则控制器没有选择,或者代理不符合所请求密钥的键值编码,相应的标记返回。换句话说,要确定实际上是否没有选择,您需要(i)访问代理对象,(ii)调用实际对象的方法之一,以及( iii)测试(ii)的返回值是否为selection
。这样做你的价值转换器的关键方法如下:
NSNoSelectionMarker
- (id)transformedValue:(id)selectionProxyObject {
// Assume the objects in my table are Team objects, with a 'name' property
return [selectionProxyObject valueForKeyPath:@"name"] == NSNoSelectionMarker ? @YES : @NO;
}
是更好的方式,因为它是完全通用的。事实上,如果你做了很多这样的事情,建立一个变压器库是一个好主意,然后你可以将其导入任何项目。以下是我馆中一些变形金刚的名字:
selectionIndexes
答案 1 :(得分:3)
我绑定到selectedObjects。@ count,而不是选择