0

NSWindowInterfaceBuilderで設定しました。のクラスを自分に設定し、コントローラーのプロパティFile's Ownerを自分NSWindowControllerにリンクしました。私のコントローラーはを実装しています。windowNSWindowNSWindowDelegate

これで、コントローラーに次のものを追加しました。

- (void)windowDidLoad
{
    [super windowDidLoad];

    [self.window setDelegate:self];
}

- (void)windowDidBecomeMain:(NSNotification *)notification
{
    NSLog(@"Did become main.");
}

それでも、-windowDidBecomeMain:呼ばれていません。なぜこれなのか誰か知っていますか?

編集

AppDelegate起動時からウィンドウを表示しようとしています。メインペン先(で宣言Info.plist)には、にリンクされているメニュー項目のみが含まれていますAppDelegate。アプリケーションデリゲートでは、ステータスバーにアイコンを表示し、このアイコンをクリックすると、メインのペン先からメニューを表示します。アプリケーションデリゲートでは、ロジックを処理するためにウィンドウコントローラーを割り当てる必要があるウィンドウも表示したいと思います。これが機能すると、ウィンドウ通知が届くと思います。

さて、次のコードはウィンドウを表示せず、理由がわかりません。

DemoWindowController *dwc = [[DemoWindowController alloc] initWithWindowNibName:@"DemoWindowController"];
[dwc showWindow:self];

selfこれがアプリケーションデリゲートであることに注意してください。

4

1 に答える 1

0

あなたの問題は、ウィンドウコントローラーが実際には nibs ファイルの所有者ではないという事実によるものだと思います。

インターフェイスビルダーでクラスを変更すると、どのアウトレットとアクションが利用可能かが伝えられます (ウィンドウアウトレットにドラッグできるのはそのためです) が、このオブジェクトを自分で渡す必要があります。

非ドキュメント ベースのアプリケーションの場合、を呼び出す main メソッドがありますNSApplicationMain。これは基本的に、info.plist ファイルで指定されているウィンドウ nib を検索してロードし、現在のNSApplicationインスタンスをファイル所有者としてこの nib に渡します (したがって、クラス タイプを に変更しても、NSWindowController渡されるオブジェクトは実際にはタイプ NSApplication です)。

問題を解決する最も簡単な方法は、今のところウィンドウ コントローラーを削除することです (実際にはまだ何もしていないため)。

-windowDidBecomeMain:アプリのデリゲートでメソッドを実装する必要があります。次に、Ctrl キーを押しながらウィンドウから appDelegate にドラッグして、ウィンドウのデリゲートとして設定し、通知を受け取ります。

アップデート

次の 2 つの問題に注意することに関する質問に答えるにはWindowController:

  1. メソッドでウィンドウ コントローラー変数 (dwc) を作成していますapplicationDidFinishLaunching:。これは、ウィンドウを持ってメソッドを終了した瞬間に解放されます。代わりに、ウィンドウ コントローラーを保持するインスタンス変数を作成します。
  2. 2 番目のウィンドウ nib のファイル所有者が NSWindowController (またはウィンドウ コントローラーの種類) に設定されていること、およびそのウィンドウ アウトレットが nib ファイル内のウィンドウに接続されていることを確認します。

ウィンドウが表示されます。

于 2012-06-17T18:32:35.020 に答える