如何判断NSPanel何时获得焦点或成为关键?

Wil*_*all 1 cocoa objective-c nswindowcontroller xcode4 nspanel

我正在XCode4中编写一个Cocoa/Objective-C应用程序,我需要知道我的首选项面板何时打开.我需要一些像windowDidBecomeKey这样的回调 ; 我试图按照提供的解决方案这个问题,但也windowDidBecomeKey还是windowDidExpose表现为委托方法(但其他人一样windowDidLoad,windowWillLoad等做的).

为了明确我的意思,"不要作为委托方法出现",我的意思是当我开始输入方法名称时,它们不会显示在自动完成中.无论如何我确实尝试过定义它们,但它们从未被调用过.

NSPanel对象缺乏这些方法,或有更多的东西我有什么关系?

目前,我有一个界面PrefWindowController:

PrefWindowController.h:

#import <Cocoa/Cocoa.h>

@interface PrefWindowController : NSWindowController
    //Delegate methods like windowDidBecomeKey appear to not be available here
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当窗口在应用程序启动时从.xib加载时,将windowDidLoad触发并显示上面定义的通知.我这样做只是为了测试方法实际上是被调用的.

有关如何在面板成为键或获得焦点时获得回调的任何建议将非常有帮助.

更新:

我向windowDidBecomeKey窗口控制器添加了一个方法,如下所示:

main.m

- (void)windowDidBecomeKey:(NSNotification *)notification;
Run Code Online (Sandbox Code Playgroud)

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

第一次打开窗口时会记录测试消息,但是在我的windowDidExpose文件的返回行中,我收到错误:"线程1:程序接收信号:"EXC_BAD_ACCESS"

jba*_*100 8

NSWindowDelegate协议具有以下方法

- (void)windowDidBecomeKey:(NSNotification *)notification
- (void)windowDidResignKey:(NSNotification *)notification
Run Code Online (Sandbox Code Playgroud)

所以你可以将NSWindowController设置为NSWindow委托来获得这个回调.您还可以注册这些通知:

NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotification
Run Code Online (Sandbox Code Playgroud)

NSPanel是NSWindow的子类,因此所有这些行为都适用于您的情况.