NSDocumentのprintDocument:が呼ばれない問題

アプリの印刷内容をカスタマイズする場合、NSDocumentのprintOperationWithSettings:error:printDocumentWithSettings:...をオーバーライドすることになりますが、デフォルトの設定ではこのメソッドが呼ばれないケースがあります。 メニューバーの「ファイル > 印刷...」を選択しても、ショートカットキー「Command+P」を利用しても、なぜかフォーカス中のViewの印刷機構が働いてしまいます。

XIB側のアクションを編集する必要がある

XIBやStoryboardで自動生成されるメニューバーの印刷ボタンには「print:」アクションがデフォルトで割り当てられています。これをNSDocumentの「printDocument:」に繋げば、ちゃんとprintOperationWithSettings:error:等が呼ばれるようになります。

プロジェクト作成時に「Create Document-Based Application」オプションを指定している場合は、きちんとprintDocument:が割り当てられるため、今回のような問題は起こりません

print:だとダメな理由

メニューバーに設定されたアクションは、基本的にファーストレスポンダーに対して投げられます。要はフォーカス中のViewに対して優先的にアクションが渡るわけですね。「print:」アクションはNSViewが既に実装済みのメソッドであるため、NSDocumentにはprintDocument:はおろか、print:アクションすら渡ってくることは無いのです。

もし今後、メニューバーのアクションを独自に設定する際には、NSView側のメソッド名と被っていないかに注意すると良いでしょう。

広告
広告