Как использовать NSWindowDidExposeNotification - PullRequest
1 голос
/ 27 апреля 2010

Я пытаюсь обновить другое окно, когда оно становится видимым. Итак, я нашел NSWindowDidExposeNotification и попытался работать с ним, поэтому я написал в своем awakeFromNib:

// MyClass.m
- (void)awakeFromNib {
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(mentionsWindowDidExpose:)
               name:NSWindowDidExposeNotification
             object:nil];
}

и реализованный способ

// MyClass.h
- (void)mentionsWindowDidExpose:(id)sender;

// MyClass.m
- (void)mentionsWindowDidExpose:(id)sender {
    NSLog(@"test");
}

Но его никогда не называют, что странно. Что я тут не так делаю?

1 Ответ

2 голосов
/ 28 апреля 2010

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

// MyClass.m
- (void)awakeFromNib {
    // note: this step can also be done in IB by dragging a connection
    // from the window's "delegate" property to your `MyClass` object
    [window setDelegate:self];
}

- (void)windowDidExpose:(NSNotification *)notification {
    NSLog(@"test");
}

Хотя после прочтения здесь и здесь , windowDidExpose может оказаться не лучшим выбором. Я бы порекомендовал попробовать метод делегата windowDidBecomeKey . Это сообщение публикуется всякий раз, когда ваше окно получает «фокус» (начинает реагировать на ввод пользователя), что может быть подходящим временем для отображения вашего второго окна.

Обновление: (в ответ на комментарии)

Документация Apple (цитируется ниже) указывает, что NSWindowDidExposeNotification действителен только для не сохраненных окон, что, согласно сообщениям, которые я привел выше, весьма необычно.

NSWindowDidExposeNotification

Размещается всякий раз, когда открывается часть несохраненного объекта NSWindow, будь то заказ перед другими окнами или удаление других окон перед ним.

Объект уведомления - это объект NSWindow, который был выставлен. Словарь userInfo содержит ... выставленный прямоугольник.

На более высоком уровне NSNotification объекты - это просто пакеты данных, которые передаются между классами Какао и NSNotificationCenter объектами. NSNotificationCenter объекты - это контроллеры, которые управляют этими пакетами данных и отправляют их наблюдателям по мере необходимости. Обычно нет необходимости перехватывать уведомления напрямую . Вы можете просто использовать KVC / KVO или предопределенные делегаты в ваших классах, и Cocoa обрабатывает все грязные детали за кулисами.

См. Темы программирования уведомлений и Руководство по программированию кодирования значения ключа , если вы хотите узнать больше.

...