トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Tag: Cocoa/メニュー

目次

関連ページ

参考情報

概要

  • Cocoaアプリケーションのメニューは、ストーリーボードを使用している場合Main.storyboardのMain Menuで定義されている。
  • 対応するイベントハンドラはそれぞれのメニュー項目を右クリックすると表示される。
  • 例えば「File > Open」の場合First ResponderのopenDocumentに接続されていることがわかる。
  • document baseのアプリの場合、openDocumentはフレームワーク側に組み込まれていて直接処理される。https://developer.apple.com/library/content/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/KeyObjects/KeyObjects.html#//apple_ref/doc/uid/TP40011179-CH3-SW2
  • document baseでない場合、例えばAppDelegateに以下のようなメソッドを追加されると呼び出され、メニューも有効となる。
        @IBAction func openDocument(_ sender: Any) {
            print("test")
        }
    
  • First Responderに設定されたアクションはnilターゲットアクションで、レスポンダーチェインを辿って送信されるため。document baseの場合も同様になる。

First ResponderアクションをInterface Builderで設定するには

  • たとえばAppDelegateにメソッドを追加。
        @IBAction func test(_ sender: Any) {
            print("test")
        }
        
    
  • IBでFirst ResponderのAttributes Inspectorを開く。
  • そこに「User Defined」としてtestを追加し、人にのメニュー項目をFirst Responderにctrlドラッグすれば良い。
  • AppDelegateにドロップすると直接バインドされてしまうので、このためにUser Definedがあるのだと思われる(もっといえばFirst Responderという項目がIB上に存在するのもそのためだと思われる)。

実装方針

  • non document baseアプリで簡単にFile > Openを実装するには、AppDelegateにopenDocumentを実装する(そこで開くダイアログを呼び出す)。
  • 独自メニューの場合、真面目にFirst Responderにしても良いけど、直バインドでも問題なさそう。
  • document baseの場合はフレームワークの流儀にあわしたほうがよさげ。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-27 (金) 17:25:57 (52d)