我想在连接到NSTableView
的{{1}}中选择多个项目时禁用NSButton。我知道我可以在没有选择任何内容时轻松禁用按钮(绑定到NSArrayController
),但我不确定如何撤消,以便@count
必须启用== 1才能启用
我正在使用Swift,但我对最佳方法比对特定语言的实现更感兴趣(除非在这种情况下Swift和Objective C之间的区别很大)。
如果选择包含多行,如何使用Cocoa绑定禁用@count
?
答案 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 属性,您可以实现使用值转换器所需的功能:
只要对阵列控制器的 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
}
}