1

別のウィンドウが表示されたときに別のウィンドウを更新しようとしています。それで、NSWindowDidExposeNotification を見つけて、それを操作しようとしたので、awakeFromNib に次のように書きました。

// MyClass.m
- (void)awakeFromNib {
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(mentionsWindowDidExpose:)
               name:NSWindowDidExposeNotification
             object:nil];
}

メソッドを実装しました

// MyClass.h
- (void)mentionsWindowDidExpose:(id)sender;

// MyClass.m
- (void)mentionsWindowDidExpose:(id)sender {
    NSLog(@"test");
}

しかし、奇妙に呼び出されることはありません。ここで何が間違っていますか?

4

1 に答える 1

2

一般的に、次のように、これらの通知を受信するために、コントローラーをウィンドウのデリゲートとして設定します。

// MyClass.m
- (void)awakeFromNib {
    // note: this step can also be done in IB by dragging a connection
    // from the window's "delegate" property to your `MyClass` object
    [window setDelegate:self];
}

- (void)windowDidExpose:(NSNotification *)notification {
    NSLog(@"test");
}

ただし、ここここを読んだ後windowDidExposeは、最善の策ではないかもしれません。代わりに、 windowDidBecomeKeyデリゲートメソッドを試すことをお勧めします。これは、ウィンドウが「フォーカス」を取得する(ユーザー入力への応答を開始する)たびに投稿されます。これは、2番目のウィンドウを表示するのに適切なタイミングである可能性があります。

更新:(コメントに応じて)

Appleのドキュメント(以下に引用)は、保持されていないウィンドウにのみ有効であることを示していますNSWindowDidExposeNotification。これは、上記でリンクした投稿によると、非常にまれです。

NSWindowDidExposeNotification

保持されていないNSWindowオブジェクトの一部が公開されるたびに投稿されます。他のウィンドウの前に並べられているか、他のウィンドウがその前から削除されているかは関係ありません。

通知オブジェクトは、公開されたNSWindowオブジェクトです。userInfoディクショナリには、公開された長方形が含まれています。

より高いレベルでは、NSNotificationオブジェクトは、Cocoaクラスとオブジェクトの間で受け渡されるデータの単なるパッケージNSNotificationCenterです。NSNotificationCenterオブジェクトは、これらのデータパッケージを管理し、必要に応じてオブザーバーに送信するコントローラーです。通常、通知を直接トラップする必要はありません。クラスでKVC/KVOまたは事前定義されたデリゲートを使用するだけで、Cocoaが舞台裏ですべての汚い詳細を処理します。

詳細については、通知プログラミングのトピックKeyValueコーディングプログラミングガイドを参照してください。

于 2010-04-27T21:50:18.957 に答える