gpt4 book ai didi

objective-c - 根据 NSArrayController 选择启用 NSButton

转载 作者:行者123 更新时间:2023-12-03 16:25:07 25 4
gpt4 key购买 nike

好的,我已经设置了一个绑定(bind)到 NSArrayControllerNSTableView

现在,我还有一个 NSButton,我想在有选择时将其“启用”,在没有选择任何内容时将其禁用。

因此,我使用 NSIsNotNil 值转换器将 NSButton 的 Enabled 绑定(bind)到数组 Controller 的 selection

NSIsNotNil Array Controller and NSButton

但是,它似乎不起作用。

我错过了什么吗?

最佳答案

无论是否选择任何内容,NSArrayControllerselection 属性都会返回一个对象 (_NSControllerProxyObject)。这就是为什么您的绑定(bind)无法按您期望的方式工作,因为 selection 永远不会是 nil。相反,我绑定(bind)到 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

顺便说一句,如果您愿意,您仍然可以绑定(bind)到 selection,但它需要自定义值转换器。 Apple 声明:如果使用键值编码从选择代理 [对象] 请求的值返回多个对象, Controller 没有选择,或者代理不符合请求的键的键值编码,则适当的返回标记。。换句话说,要查明是否实际上没有选择,您需要 (i) 访问代理对象,(ii) 调用实际对象的方法之一,并且( iii) 测试 (ii) 的返回值是否为 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 是更好的方法,因为它是完全通用的。事实上,如果您经常做这种事情,那么构建一个转换器库可能是个好主意,然后您可以将其导入到任何项目中。以下是我的库中一些变压器的名称:

SelectionIndexesCountIsZero
SelectionIndexesCountIsExactlyOne
SelectionIndexesCountIsOneOrGreater
SelectionIndexesCountIsGreaterThanOne
// ...you get the picture

关于objective-c - 根据 NSArrayController 选择启用 NSButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26860490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com