Как определить, когда NSPanel получает фокус или становится ключевым? - PullRequest
1 голос
/ 02 декабря 2011

Я пишу приложение Cocoa / Objective-C в XCode4, и мне нужно знать, когда открыта моя панель настроек. Мне нужен какой-нибудь обратный вызов, например 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

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"

1 Ответ

8 голосов
/ 02 декабря 2011

Протокол NSWindowDelegate имеет следующие методы

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

, поэтому вы можете установить NSWindowController в качестве делегата NSWindow для получения этого обратного вызова.Вы также можете зарегистрироваться для этих уведомлений:

NSWindowDidResignKeyNotification
NSWindowDidBecomeKeyNotification

NSPanel является подклассом NSWindow, поэтому все это поведение применимо в вашем случае.

...