0

StackOverflow と Cocoa newbye の最初の質問に加えて、XCode 4 を使用しています (親切にしてください!)

シナリオ:

単純なNSPersistentDocumentマルチウィンドウ: 各ドキュメントにはwindow.nibと添付された WindowController がありますWINDOW TOOLBARボタンを押すと、 アプリケーションは(バックグラウンドで) NSTaskを実行します。

ウィンドウ (ビュー内) に、タスクの開始時にアニメーション化され、タスクの終了時に stopAnimation になる素敵な NSProgressIndicator (不確定) を配置することにしました (通知を通じてタスク メッセージを収集します)。

サンプルコード:

NSButton --> IBAction --> WindowController のメソッド

- (IBAction)launchSim:(id)sender 
{
[simcell launchTask];
[progBar startAnimation:self];
   .... more code ...
}

すべてが素晴らしく完璧に機能します。

ここで (このシナリオではいつものように) 奇妙なバグが発生し、非生産的になり始めます。

MainMenu (NSMenuItem から) からも同じアクションを実行することにしました。

MainMenu.xib で:

NSMenuItem ("RUN") --> FirstResponder --> First Responder:launchSim のユーザー定義アクション (タイプ ID)

RUN メニュー項目はタスク (NSLog DEBUG メッセージがあります) を正しく実行しますが、progressBar のアニメーション (startAnimation) は開始しません!

2 つのアクションの違い:

  • 最初のもの (作業中) は、WindowController が所有する Nib ファイルから呼び出されます。
  • 2 つ目 (動作していない) は MainMenu.xib から呼び出され、FirstResponder に送信されます。

どちらのアクションもメソッド内のコードの他の部分を正しく実行しますが、メニューからアクションを呼び出すと、進行状況インジケーターのアニメーションが表示されません。

私は何が欠けていますか?

よろしくお願いします

4

2 に答える 2

0

バグを見つけたので、私は自分自身に答えます:

構造は、「高度な」NSPersistentDocument の古典的な構造です。

  1. ドキュメントの 1 つのクラス
  2. ビューを制御する NSWindowController の 1 つのサブクラス

これは MVC アーキテクチャに従います。

  • モデル: ドキュメント
  • コントローラー:窓に取り付け
  • ビュー: 窓

私の間違いは、ビューで NSObject を作成し、それを NSWindowController にリンクすることでしたが、これを行う正しい方法は、NSWindowController のサブクラスをファイル所有者として設定し、魔法のように MainMenu もアニメーションを開始することです。これは何らかの形でレスポンダーの連鎖に関連していますが、私の現在の Cocoa に関する知識とはかけ離れています。誰かがコメントして説明できるなら....

于 2011-05-27T07:24:38.497 に答える
0

メニュー項目をアクションに接続するために、ファーストレスポンダで何もする必要はありません。

メニュー項目にアクションを実行させるのは、ボタンにアクションを実行させるのとまったく同じように機能します。

  • nibファイルを開きます。
  • メニューに移動し、アクションをトリガーするはずの「実行」メニュー項目に移動します。
  • メニュー項目を Ctrl キーを押しながらクリックし、接続線をウィンドウ コントローラにドラッグします。
  • ドラッグを放すと、メニュー ポップアップが表示されます。launchSim: をクリックすると、すべての設定が完了します。
于 2011-05-25T20:31:17.740 に答える