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
}
}
私が使用している別の方法は、CocoaバインディングとKVOですが、必ずしもうまく機能するとは限りません。
このように、特にNSButtonとNSSegmentedControlを含む、タッチバー項目を検証するための標準的な方法が推奨されているかどうかは不思議です。私はアイテムの可用性だけでなく、場合によっては状況に応じて画像や色を変更することもあります。あなたはどうやってタッチバーのアイテムを検証していますか?
私はこの回答の後に私のアプリのための多くを改善しました。最新のコードについては、https://github.com/coteditor/CotEditor/blob/develop/CotEditor/Sources/NSTouchBar%2BValidation.swiftを参照してください。 – 1024jp