Какао проверяет пункты меню в нескольких окнах

У меня есть пункт меню «foobar», который мне нужно включить в главном окне (делегат приложения), но отключить во всех других окнах. Я хотел бы знать, как это сделать, потому что бизнес первого ответчика меня очень сбивает с толку. Вот что у меня есть сейчас:

  • Элемент «foobar» связан с пользовательским действием «foobar:» первого ответчика в MainMenu.xib
  • в главном делегате приложения есть действие «foobar:», поэтому пункт меню включен и работает
  • теперь я загружаю и "makeKeyAndOrderFront" другое окно
  • я фокусирую некоторый контроль на этом новом окне
  • это место, где мой элемент "foobar" должен быть отключен, но это не так

Я вижу, что «validateMenuItem» вызывается в делегате приложения, но не вызывается в контроллере второго окна.

Может ли кто-нибудь объяснить мне это очень простыми словами, почему это происходит и какие у меня есть варианты, чтобы решить эту проблему?

Спасибо за ваши мысли


person Marius    schedule 20.12.2012    source источник


Ответы (1)


Установите делегат вашего приложения в качестве делегата главного окна и реализуйте этот метод:

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    [foobar setEnabled: YES];
}

- (void)windowDidResignKey:(NSNotification *)notification
{
    [foobar setEnabled: NO];
}

О службе быстрого реагирования

Первым ответчиком является NSControl, который находится внутри окна. Например, в конкретном окне у вас есть два текстовых поля: textField1 и textField2. Когда вы вводите ввод, идет только первый ответчик (один между всеми элементами управления, которые принимают первый ответчик ). Так что вам нужно знать, какое окно является ключевым, вам не нужно знать, кто первый ответит в вашем конкретном случае.

ИЗМЕНИТЬ

Есть и другой (может быть, более быстрый, но зависит от личных предпочтений) способ сделать это: через конструктор интерфейса выбрать пункт меню, который вы хотите сделать активным только тогда, когда определенное окно является ключевым. Предположим, что это окно является иваром делегат приложения с именем window1. Затем щелкните этот пункт меню, перейдите к инспектору привязок, в разделе «включено» выберите «привязать к: делегат приложения», путь к ключу модели: self.window.isKeyWindow.

Небольшая подсказка по изображению:

введите здесь описание изображения

person Ramy Al Zuhouri    schedule 20.12.2012
comment
Это ручное включение элементов. И я не использую только один пункт меню или только одно окно. Нет ли способа реализовать автоматическое включение, как в делегате приложения? Я полагаю, что мог бы перенаправить вызов validateItem: из делегата приложения в любое окно, которое является ключевым, но все эти обходные пути просто странные... какой смысл в validateItem, если вы не можете заставить его работать без необходимости писать ненужный код. - person Marius; 20.12.2012
comment
Есть способ сделать это с IB, скоро напишу. - person Ramy Al Zuhouri; 20.12.2012
comment
Спасибо за советы, Рами. - person Marius; 20.12.2012