2016-07-05 11 views
0

Я хотел бы отключить NSButton, когда несколько элементов выбраны в NSTableView, который подключен к NSArrayController. Я знаю, что я могу легко отключить кнопку, когда ничего не выбрано (привязка к @count), но я не уверен, как отменить это так, чтобы @count должен был быть включен 1.Отключить NSButton, когда выбрано несколько элементов - привязки какао

Я использую Swift, но меня больше интересует лучший метод, чем конкретная реализация на языке (если разница между Swift и Objective C в этом случае не является большой).

Как использовать привязки какао для отключения NSButton, если выбор включает более одной строки?

ответ

1

Предполагая существующую привязку связывает ваши кнопки он включены привязки к selectionIndexes вашего контроллера массива свойства, вы можете добиться того, что вы после того, как с трансформатором значения:

enter image description here

состояния кнопки будет быть обновлен в любое время, когда есть изменение в контроллере массива selectionIndexes. Часть этого обновления будет включать вызов вашего преобразователя значений, где входящим значением будет обновленный код Indexes.Ваш трансформатор логика должна превратить этот объект в логическое значение (включено, или не включена), которая в свою очередь определяет состояние кнопки:

@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 
    } 
} 
+0

Отлично, это именно то, что я был после (я хотел избежать подклассификации моего «NSTableView»). Я думаю, что понимаю, что происходит, но зачем мне нужно ключевое слово '@ objc'? Это потому, что привязки Cocoa ожидают, что 'NSValueTransformer' будет доступен в ObjC, а не Swift? – glenstorey

+0

Я точно не знаю, что такое ключевое слово '' @ objc'', но да, это предмет совместимости Swift/Objective-C. По крайней мере, когда Swift впервые появился, преобразователи значения, написанные в Swift и ссылающиеся в Interface Builder, не работали без этого ключевого слова. –

+0

А, ок. Если я выберу это, то получаю исключение, говоря, что трансформатор значения не может быть найден, так что, безусловно, все еще, кажется, так. – glenstorey

3
  • Мы предполагаем, что класс, содержащий табличное называется tableViewController
  • Объявите свойство selectionIndexes в tableViewController.

    Objective-C:

    @property NSIndexSet *selectionIndexes; 
    

    Свифта:

    dynamic var selectionIndexes = NSIndexSet() 
    
  • переплета Selection Indexes в виде таблицы к этому свойству.

  • В tableViewController добавить эти два метода

    Objective-C:

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

    Swift:

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

    keyPathsForValuesAffecting<key> является способ легко реализовать ключ-значение наблюдателя.

  • Теперь привяжите имущество Enabled на enableButton от tableViewController.

Если вы используете контроллер массива, связать Selection Indexes в виде таблицы в selectionIndexes контроллера массива и Selection Indexes контроллера массива на selectionIndexes из tableViewController.

+0

Спасибо. Я пытался сохранить язык агностиком, так как это больше о том, как правильно привязывать, чем реализовывать его (я использую Swift, но это легко конвертировать). Я удивлен, что решение не связано с моим «NSArrayController» ..? (может быть, мой вопрос был слишком расплывчатым)! – glenstorey

+0

Я обновил ответ. – vadian