macOS: правильный способ предоставления свойств Swift привязкам какао - PullRequest
1 голос
/ 03 мая 2019

Я работаю над существующим проектом Swift / Objective-C на Mac и создаю некоторый пользовательский интерфейс в коде. Я включаю кнопку на основе выбора в NSTableView, которым я управляю без , используя NSArrayController (по причинам).

У меня есть свойство selectionIndexes на MyController:

@objc var selectionIndexes : IndexSet = IndexSet()

Я не уверен, нужен ли @objc, чтобы сделать его видимым для системы привязки Какао.

Я подключаю привязку кнопки enabled, используя:

newButton.bind(NSBindingName.enabled, to: MyController.sharedInstance,
     withKeyPath: "selectionIndexes", 
     options: [NSBindingOption.valueTransformer : MyTransformer()])

Это работает нормально, преобразователь вызывается с правильным свойством, и значение «enable» установлено правильно, , но изменения в выборе не вызывают привязку , поэтому кнопка остается отключенной.

Мне пришлось явно сказать системе, что я меняю значение, например,

self.willChangeValue(for: \.selectionIndexes )
self.selectionIndexes = proposedSelectionIndexes
self.didChangeValue(for: \.selectionIndexes)

Это выглядит довольно отстойно. Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 03 мая 2019

@objc необходимо для предоставления свойства среде выполнения Objective-C.

Чтобы обеспечить соответствие значения ключа свойства при соблюдении, необходимо добавить ключевое слово dynamic

@objc dynamic var selectionIndexes = IndexSet()

и удалите ...ChangeValue(for строк

...