2011-12-02 37 views
0

我在XCode4中编写了一个Cocoa/Objective-C应用程序,并且我需要知道我的首选项面板何时打开。我需要一些回调像windowDidBecomeKey;我试图遵循this question中提供的解决方案,但windowDidBecomeKeywindowDidExpose都不会显示为委托方法(但其他人,如windowDidLoad,windowWillLoad等)。如何判断NSPanel何时获得焦点或成为关键?

为了澄清正是我的意思“不出现委托方法”,我的意思是,他们不会在自动完成显示当我开始键入的方法名。我确实尝试定义它们,但它们从未被调用过。

请问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: - (无效)windowDidBecomeKey:(NSNotification *)通知NSLog(@“Test”); }

测试消息得到记录我第一次打开窗口,但在我main.m文件中的返回行我得到的错误:`线程1:计划接收的信号:“EXC_BAD_ACCESS”

回答

8

NSWindowDelegate协议有以下方法

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

,所以你可以设置你的NSWindowController为NSWindow代表获得此回调。您也可以注册这些通知:

NSWindowDidResignKeyNotification 
NSWindowDidBecomeKeyNotification 

NSPanel是NSWindow子类,所以所有这些行为适用于您的情况。

+0

'windowDidBecomeKey'方法似乎工作 - 但看到我的更新问题。这可能与我没有使用窗口管理器打开窗口(并且窗口在关闭时被设置为释放)有关吗?不过,我有点不清楚我会如何从另一个班级那样做。也就是说,获取一个PrefWindowManager的实例,我可以用它打开窗口。 – WilHall

+0

你有日志吗?没有更多的信息很难说。 – jbat100

+0

我解决了这个问题 - 这实际上是因为窗口关闭了。谢谢! – WilHall

相关问题