Почему я не могу открывать настройки из каждого окна?

Я наткнулся на это приложение Какао (исходный код), которое показывает главное окно.

Пока это окно является ключевым, можно открыть окно настроек из главного меню, а также нажав Command-,, но когда главное окно не является ключевым и в другом окне того же приложения NSMenuItem неактивен, и сочетание клавиш не отвечает.

Я проверил файл xib, связанный с главным меню, и что NSMenuItem отправляет openPreferences:(id)sender IBAction в FirstResponder, который может быть NSApplication.

Что мне не хватает (я все еще новичок в программировании какао для Mac)? Как я могу исправить это, чтобы настройки были доступны из каждого окна приложения?


person rano    schedule 07.11.2010    source источник


Ответы (1)


Вероятно, первоначальный автор реализовал - (BOOL)validateMenuItem:(NSMenuItem *)menuItem и при некоторых обстоятельствах возвращает NO.

NSMenuValidationProtocol документация .

Обновление: еще одно быстрое предположение: возможно, объект, который обрабатывает IBAction для пункта меню, больше не находится в цепочке респондентов после открытия второго окна. NSMenuItems включены только в том случае, если селектор действий можно найти в цепочке респондентов.

person Thomas Zoechling    schedule 07.11.2010
comment
Я проверил его по всему проекту (текстуально), но он никогда не вызывается и не реализуется. - person rano; 07.11.2010
comment
Обновил мой исходный ответ другой идеей. - person Thomas Zoechling; 07.11.2010
comment
Это второе предположение было тем, о чем я думал. Вероятно, автор реализовал openPreferences: в главном окне или его оконном контроллере, а не в чем-то более глобальном. Таким образом, каждый раз, когда основное окно (и его WC, если он есть) не входит в цепочку респондентов, ничто из того, что в нем есть, не реагирует на это действие, поэтому любой пункт меню, который отправил бы это действие, отключается. - person Peter Hosey; 07.11.2010
comment
Я надеюсь, что rano опубликует решение. - person Thomas Zoechling; 07.11.2010
comment
Я тоже пришел к выводу Питера Хози (прочитав несколько частей документации от Apple). Чтобы решить эту проблему, вы можете просто переназначить отправленное действие для openPreferences: с правильного (= простого) контроллера (который его реализует), а не через FirstResponder. - person rano; 09.11.2010
comment
@Peter Hosey, только теперь я узнаю вас как разработчика Adium и Growl :) Я действительно восхищаюсь вашими работами - person rano; 09.11.2010
comment
rano: Я не разработчик, стоящий за ними. И то, и другое - в основном работа других людей. Но спасибо вам от всех нас. ☺ - person Peter Hosey; 09.11.2010
comment
Я знаю: П, я говорил конкретно о вашей веб-странице и извините за мой плохой английский - person rano; 09.11.2010