#author("2018-04-27T17:25:43+09:00","default:wikiwriter","wikiwriter")
#author("2018-04-27T17:25:57+09:00","default:wikiwriter","wikiwriter")
&tag(Cocoa/メニュー);
*目次 [#l0619296]
#contents
*関連ページ [#bc7f7852]
*参考情報 [#r2156c71]


*概要 [#h99f1e7a]
-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に以下のようなメソッドを追加されると呼び出され、メニューも有効となる。
#pre{{
    @IBAction func openDocument(_ sender: Any) {
        print("test")
    }
}}
-First Responderに設定されたアクションはnilターゲットアクションで、レスポンダーチェインを辿って送信されるため。document baseの場合も同様になる。

*First ResponderアクションをInterface Builderで設定するには [#ead4558e]
-たとえばAppDelegateにメソッドを追加。
#pre{{

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


*実践メニュー [#h7d249e1]
*実装方針 [#h7d249e1]
-non document baseアプリで簡単にFile > Openを実装するには、AppDelegateにopenDocumentを実装する(そこで開くダイアログを呼び出す)。
-独自メニューの場合、真面目にFirst Responderにしても良いけど、直バインドでも問題なさそう。
-document baseの場合はフレームワークの流儀にあわしたほうがよさげ。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS