我正在用XCode4编写Cocoa / Objective-C应用程序,我需要知道何时打开“首选项”面板。我需要像windowDidBecomeKey这样的回调;我尝试遵循this question中提供的解决方案,但windowDidBecomeKeywindowDidExpose均未显示为委托方法(但是其他方法,例如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”

最佳答案

NSWindowDelegate协议具有以下方法

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


因此您可以将NSWindowController设置为NSWindow委托以获取此回调。您还可以注册以下通知:

NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotification


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

关于objective-c - 如何判断NSPanel何时成为焦点或成为关键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8359347/

10-10 14:15