11

ドキュメントベースのアプリケーションがあります。ストーリーボードにメニュー項目を作成し、View Controller に IBActions を作成しました。ただし、アクションをターゲットに接続する通常の方法は機能しません

-(IBAction) markAsHidden:(id)sender;
-(IBAction) markAsVisible:(id)sender;
-(IBAction) toggleHidden:(id)sender;

これは、メニュー項目から Ctrl キーを押し、メニューから View Controller にマウス クリックしたときに表示されるものです。IBActions が表示されません。

何か案が ?私の2セントの推測では、アプリがドキュメントベースであることに関係しているということですが...よくわかりません

接続メニュー

4

3 に答える 3

11

メニューをView Controller IBActionに接続できないのはなぜですか?

メニュー項目とビュー コントローラーがストーリーボードの異なるシーンにあるためです。シーンは、シーンがストーリーボードからロードされるときにインスタンス化されるオブジェクトの独立したグラフと考えることができます。異なるシーンのオブジェクトは、同時に読み込まれないため、絵コンテで一緒に接続することはできません。

お遊びとして、ストーリーボードのアプリケーション シーンにビュー コントローラーのインスタンスを作成してみてください。NSObjectそのためには、通常の古いインスタンスをシーンにドラッグしてから、そのタイプを設定する必要があります。これを行うと、期待どおりにメニュー項目からそのView Controllerに接続をドラッグできることがわかりますが、別のオブジェクトのまったく同じタイプの別のオブジェクトに接続をドラッグすることはできませんシーン。

注:動作することを十分に確認したら、追加したビュー コントローラーを忘れずに削除してください。ビューのないビュー コントローラーは、いんちきのないアヒルのようなものであり、ビュー コントローラーとそのビュー階層は独自のシーンにある必要があります。

私の 2 セントの推測では、アプリがドキュメント ベースであることに関係しているということです。

いいえ、それとは何の関係もありません。ドキュメントベースではないアプリでも同じ問題が発生します。接続しようとしているコントローラーがまったく異なる .xib ファイルにあるため、アプリがストーリーボードを使用する代わりに .xib ベースである場合にも、同じ問題が発生します。

マークがすでに説明したように、簡単な解決策はレスポンダー チェーンを使用することです。First Responderプロキシ オブジェクトはすべてのシーンの一部であるため、いつでも接続できます。メニュー項目を First Responder に接続すると、そのターゲットは になり、メニュー項目のアクション メッセージに応答するオブジェクトが見つかるまでレスポンダー チェーンnilをたどるように指示されます。NSMenu次に、メッセージをそのオブジェクトに送信します。

于 2015-02-23T20:39:39.337 に答える
2

プロジェクトを Objective C から Swift に変換する場合、私の間違いを犯さないでください。IBAction を記述するときは、次のように記述します。

 @IBAction func someAction(_ sender:AnyObject) {
     // this will work
 }

前にアンダースコアを省略しないでください。省略しないsenderと、Interface Builder が次のようにアクションに接続できなくなります。

 @IBAction func someAction(sender:AnyObject) {
     // this won't work and IB won't connect to this action
     // because sender will be part of the symbol name
 }
于 2016-12-28T13:07:47.913 に答える