В AppKit элементы меню и элементы панели инструментов имеют validateMenuItem(_:)
и validateToolbarItem(_:)
соответственно. Однако с помощью новых элементов сенсорной панели нет такого метода удобства для проверки соответствующих элементов в нужный момент.Лучший практический способ проверки элементов NSTouchBar
Теперь я проверяю элементы штриховки каждый раз, когда изменяю связанные значения и вызывается метод проверки в didSet
(см. Следующий пример кода). Но я чувствую, что это не очень хорошо, потому что связанные значения должны знать, что в зависимости от этого есть элемент сенсорной панели.
var foo: Foo? {
didSet {
if #available(macOS 10.12.1, *), NSClassFromString("NSTouchBar") != nil {
self.validateTouchBarItem(identifier: .foo)
}
}
}
@available(macOS 10.12.1, *)
func validateTouchBarItem(identifier: NSTouchBarItemIdentifier) {
guard
let item = self.touchBar?.item(forIdentifier: identifier),
let button = item.view as? NSButton
else { return }
switch identifier {
case NSTouchBarItemIdentifier.foo:
button.isEnabled = (self.foo != nil)
default: break
}
}
Другим способом, который я использую, является связывание какао и KVO, однако оно не всегда хорошо работает.
Итак, мне любопытно, есть ли какой-либо рекомендуемый или дефакто-стандартный способ проверки элементов сенсорной панели, особенно содержащий NSButton и NSSegmentedControl. Я хочу изменить не только доступность предметов, но иногда и изображения или цвета их в зависимости от ситуации. Как вы, ребята, проверяете элементы сенсорной панели?
После этого ответа я улучшил свое приложение. См. Https://github.com/coteitor/CotEditor/blob/develop/CotEditor/Sources/NSTouchBar%2BValidation.swift для получения последнего кода. – 1024jp