根据NSArrayController选择设置NSButton

时间:2014-11-11 08:22:30

标签: objective-c cocoa nstableview nsarraycontroller nsbutton

好的,所以我设置了一个NSTableView绑定到NSArrayController

现在,我还有一个NSButton,当 选择时,我想让它“启用”,当没有选择时,我会禁用它。

所以,我绑定NSButton已启用数组控制器的selection,其值变换为NSIsNotNil

NSIsNotNil Array Controller and NSButton

然而,它似乎没有起作用。

我错过了什么吗?

2 个答案:

答案 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,而不是选择