【问题标题】:Set NSButton enabled based on NSArrayController selection根据 NSArrayController 选择设置 NSButton 启用
【发布时间】:2023-04-03 21:49:01
【问题描述】:

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

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

所以,我将 NSButton 的 Enabled 绑定到阵列控制器的 selection,其值转换器为 NSIsNotNil

但是,它似乎不起作用。

我错过了什么吗?

【问题讨论】:

    标签: objective-c cocoa nstableview nsarraycontroller nsbutton


    【解决方案1】:

    无论是否选择了任何内容,NSArrayControllerselection 属性都会返回一个对象 (_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
    

    顺便说一句,如果您愿意,您仍然可以绑定到selection,但它需要一个自定义值转换器。 Apple 声明:如果使用键值编码从选择代理 [object] 请求的值返回多个对象,控制器没有选择,或者代理不符合所请求键的键值编码,则适当的返回标记。换句话说,要查明是否实际上没有选择,您需要 (i) 访问代理对象,(ii) 调用 actual 对象的方法之一,以及 ( 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
    

    【讨论】:

    • 很好的解释。非常感谢,我正在尝试! ;-)
    • 优秀的解决方案。我最终创建了一个更通用的转换器,名为CountIsNonZero,实现- (id)transformedValue:(id)value { if (![value respondsToSelector:@selector(count)]) value = nil; return @([value count]!=0); },几乎可以与任何集合对象一起使用。
    【解决方案2】:

    我绑定到 selectedObjects.@count,而不是选择

    【讨论】:

    • 嗯,我喜欢你的建议背后的逻辑。但是,它怎么可能对我不起作用? (控制器密钥:selectedObjects,模型密钥路径:@count
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2019-10-25
    • 2023-03-19
    • 2014-10-01
    • 2017-06-03
    • 1970-01-01
    相关资源
    最近更新 更多