2017-02-26 7 views
2

私は、ビューとしてNSButtonとメインメニューにNSMenuItemを持つNSToolbarItemを持っています。どちらも同じアクションを持っており、特定のターゲットではなく最初のレスポンダに送信されます。このメソッドは最終的に、ウィンドウのコンテンツビューのビュー階層のどこかにあるNSSplitViewControllerのサブクラスに実装されます。私は両方の項目を検証したいが、そのコントローラにローカルないくつかの条件に依存しているので、その特定の分割ビューコントローラが検証を処理するようにする。関連するコントローラのNSToolbarItem検証

スプリットビューコントローラでvalidateToolbarItem(_:)validateMenuItem(_:)をオーバーロードしました。メニュー項目の場合、これは期待どおりに機能しています。このメソッドが呼び出され、検証が行われます。しかし、validateToolbarItem(_:)は決して呼び出されません。

Apple’s documentationによれば、NSToolbarはビューベースのツールバー項目にvalidateToolbarItem(_:)を送信しません。これをテストするために、ツールバーのアイテムをイメージツールバーのアイテムに置き換え、そこに期待どおりに機能します。

これに基づいて、私はいくつかの解決策に出くわしましたが、私の望むものではありません。

  • サブクラスNSToolbarItemとオーバーライドvalidate()。しかし、コントローラのvalidateToolbarItem(_:)がどのように呼び出されるのかについての指針はありません。

  • サブクラスNSToolbarをオーバーライドしてvalidateVisibleToolbarItems()をオーバーライドし、最初のレスポンダにメッセージを送信します。ここで私は、スプリットビューコントローラにメッセージを送ることができないという問題に取り掛かりました。なぜなら、ツールバーのレスポンダチェーンの外側にあるからです。

  • サブクラスNSToolbarは上記と同じですが、NSWindowControllerなどレスポンダチェーン内にあるコントローラにvalidateToolbarItem(_:)を実装します。これは動作しますが、メニュー項目に必要でないものを処理するコードを追加する必要があります。

画像ツールバーの項目とメニュー項目のように機能する優れたソリューションがありますか?

答えて

2

ボタンのNSToolbarItemサブクラスに次のコードを記述しました。このtoolbarItemサブクラスでは、通常はvalidateUserInterfaceItem()またはvalidateToolbarItem()を使用して、NSControlを含むツールバー項目を検証できます。

override func validate() { 

    // validate content view 
    if 
     let control = self.view as? NSControl, 
     let action = self.action, 
     let validator = NSApp.target(forAction: action, to: self.target, from: self) as AnyObject? 
    { 
     switch validator { 
     case let validator as NSUserInterfaceValidations: 
      control.isEnabled = validator.validateUserInterfaceItem(self) 
     default: 
      control.isEnabled = validator.validateToolbarItem(self) 
     } 

    } else { 
     super.validate() 
    } 
} 
+0

私が探していたちょうどエレガントな解決策。どうもありがとう! – Eitot

+0

美しい!これを共有してくれてありがとう。あなたは2つのことを説明してもらえますか?1)これはなぜ必要なのですか?なぜこれでCocoaはすでにこれをしていませんか? b)どのくらいの頻度でこれが呼び出されると思いますか?あなたのコードの私の迅速な実装では、それは非常に予期せず、そしてむしろ頻繁に呼び出されるようです。 –

+0

@ jeff-h 1)NSToolbarItemの内部ビューは、NSControl以上のものでもかまいません。だから、Cocoaはそれが何であるか、それを検証する方法を知らない。 2)イベントトリガーとタイマーの組み合わせです。検証のタイミングの詳細は、参考文献(https://developer.apple.com/reference/appkit/nstoolbar/1516947-validatevisibleitems)で確認できます。 – 1024jp

関連する問題