选择多个项目时禁用NSButton - Cocoa Bindings

时间:2016-07-05 18:05:59

标签: cocoa cocoa-bindings appkit

我想在连接到NSTableView的{​​{1}}中选择多个项目时禁用NSButton。我知道我可以在没有选择任何内容时轻松禁用按钮(绑定到NSArrayController),但我不确定如何撤消,以便@count必须启用== 1才能启用

我正在使用Swift,但我对最佳方法比对特定语言的实现更感兴趣(除非在这种情况下Swift和Objective C之间的区别很大)。

如果选择包含多行,如何使用Cocoa绑定禁用@count

2 个答案:

答案 0 :(得分:4)

  • 我们假设包含表视图的类名为tableViewController
  • selectionIndexes中声明属性tableViewController

    目标-C:

    @property NSIndexSet *selectionIndexes;
    

    夫特:

    dynamic var selectionIndexes = NSIndexSet()
    
  • 将表格视图的Selection Indexes绑定到该属性。

  • tableViewController中添加这两种方法

    目标-C:

    + (NSSet *)keyPathsForValuesAffectingEnableButton
    {
      return [NSSet setWithObject:@"selectionIndexes"];
    }
    
    - (BOOL)enableButton
    {
      return self.selectionIndexes.count < 2;
    }
    

    夫特:

    override class func keyPathsForValuesAffectingEnableButton(key : String) -> Set<String> {
         return Set<String>(["selectionIndexes"])
    }
    
    func enableButton() -> Bool
    {
      return selectionIndexes.count < 2
    }
    

    keyPathsForValuesAffecting<key>是一种轻松实现键值观察器的方法。

  • 现在将按钮的Enabled属性绑定到enableButton的{​​{1}}。

如果您使用的是数组控制器,请将表视图的tableViewController绑定到阵列控制器的Selection Indexes,将数组控制器的selectionIndexes绑定到Selection Indexes selectionIndexes 1}}。

答案 1 :(得分:2)

假设您的现有绑定将按钮的启用绑定绑定到阵列控制器的 selectionIndexes 属性,您可以实现使用值转换器所需的功能:

enter image description here

只要对阵列控制器的 selectionIndexes 属性进行更改,按钮的状态就会更新。此更新的一部分将涉及对您的值转换器的调用,其中传入的值将是更新的 selectionIndexes 。您的变换器逻辑必须将此对象转换为布尔值(启用或未启用),这将依次确定按钮的状态:

@objc(SelectionIndexesCountIsOneOrZeroTransformer)
public class SelectionIndexesCountIsOneOrZeroTransformer): NSValueTransformer {

    override public class func allowsReverseTransformation() -> Bool {
        return false
    }

    override public class func transformedValueClass() -> AnyClass {
        return NSNumber.self
    }

    override public func transformedValue(value: AnyObject?) -> AnyObject? {
        var retval = false

        if let indexSet = value as? NSIndexSet {
            retval = (indexSet.count < 2)
        }

        return retval
    }
}