1

XCode4でCocoa/Objective-Cアプリを作成していますが、設定パネルがいつ開かれるかを知る必要があります。windowDidBecomeKeyのようなコールバックが必要です。私はこの質問で提供された解決策に従おうとしましたが、どちらもwindowDidBecomeKeyデリゲートwindowDidExposeメソッドとして表示されません(ただし、、などの他のメソッドwindowDidLoadwindowWillLoadそうします)。

「デリゲートメソッドとして表示されない」とはどういう意味かを明確にするために、メソッド名を入力し始めたときにオートコンプリートに表示されないことを意味します。とにかくそれらを定義しようとしましたが、呼び出されることはありませんでした

オブジェクトにはこれらのメソッドがありませNSPanelんか、それとも私がしなければならないことがもっとありますか?

現在、私はインターフェースを持っていますPrefWindowController

PrefWindowController.h:

#import <Cocoa/Cocoa.h>

@interface PrefWindowController : NSWindowController
    //Delegate methods like windowDidBecomeKey appear to not be available here
@end

PrefWindowController.m:

@implementation PrefWindowController

- (id)initWithWindow:(NSWindow *)window
{
    self = [super initWithWindow:window];
    if (self) {
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
        [alert setMessageText:@".."];
        [alert runModal];
    }

    return self;
}

- (void)windowDidLoad
{
    NSAlert *alert = [[[NSAlert alloc] init] autorelease];
    [alert setMessageText:@"Loaded"];
    [alert runModal];
}

@end

アプリケーションの起動時にウィンドウが.xibから読み込まれると、起動し、windowDidLoad上記で定義された通知が表示されます。これは、メソッドが実際に呼び出されていることをテストするためだけに行いました。

パネルが重要になったとき、または焦点が合ったときにコールバックを取得する方法についてのアドバイスは非常に役立ちます。

アップデート:

windowDidBecomeKey次のようなメソッドをウィンドウコントローラーに追加しました。

PrefWindowController.h:

- (void)windowDidBecomeKey:(NSNotification *)notification;

PrefWindowController.m:

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    NSLog(@"Test");
}

ウィンドウを初めて開いたときにテストメッセージがログに記録されますが、main.mファイルの戻り行に次のエラーが表示されます。

スレッド1:プログラム受信信号: "EXC_BAD_ACCESS"

4

1 に答える 1

8

NSWindowDelegateプロトコルには次のメソッドがあります。

- (void)windowDidBecomeKey:(NSNotification *)notification
- (void)windowDidResignKey:(NSNotification *)notification

NSWindowController を NSWindow デリゲートとして設定して、このコールバックを取得できます。これらの通知に登録することもできます。

NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotification

NSPanel は NSWindow サブクラスであるため、このすべての動作がケースに適用されます。

于 2011-12-02T16:25:47.877 に答える