#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の場合はフレームワークの流儀にあわしたほうがよさげ。