2009-12-17 2 views
0

Это может быть очень простым, но я не могу найти его:NSWindow не реагирует на нажатие клавиши командной s

У меня есть три окна в три отдельных NIBS в моем приложении. Один открывается при открытии нового документа, остальные два могут быть открыты из меню окна программы.

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

Любые идеи?

ответ

2

Убедитесь, что делегат окна установлен в оконный контроллер и что оконный контроллер реализует -saveDocument: (или какое-либо действие, связанное с элементом сохранения).

+0

Но я не хочу внедрять saveDocument и все другие сочетания клавиш, я просто хочу передать их на свой контроллер документа. Каким-то образом они не передаются. – wackazong

+0

Уточнение: документ не является контроллером документа. Контроллер документа контролирует документы. –

2

Windows не реагирует на комбинации клавиш. Элементы меню. В ответ на нажатие (используя мышь, используя комбинацию клавиш или используя доступность), пункт меню отправляет свое сообщение о действии по цепочке ответчиков.

Вы получаете звуковой сигнал, когда ничто в цепочке ответчиков не отвечает на сообщение о действии.

Предполагая, что это приложение на основе NSDocument, и вы запустили шаблон приложения Apple на основе приложения, действие пункта меню - saveDocument:, а объект NSDocument - это объект, который отвечает на это сообщение. Когда окна вашего документа активны, их документы находятся в цепочке ответчиков, поэтому элемент меню, который отправляет это сообщение о действии, включен. Когда ваше третье окно активно, документ не находится в цепочке ответчиков; ничто другое не реагирует на это сообщение, поэтому пункт меню отключен.

Эта проблема не является специфичной для Save-it, которая затрагивает все сообщения о действиях, которые должны пройти к объекту документа. Одним из важных примеров является Print: пользователь, вероятно, будет печатать документ, а не третье окно.

Возможно, вы сделали это третье окно своего рода окном, которое существует как одноранговое соединение с другими окнами. Помимо этой проблемы с цепочкой ответов, которую вы испытываете, пользователь также, вероятно, не поймет, что они оставили документ; они ожидают, что смогут делать документальные вещи. Подумайте о том, чтобы вместо этого сделать панель управления.

Если у вас действительно есть причина, чтобы сделать это окно каким бы то ни было оконным окном, вам нужно сохранить последний активный объект документа в цепочке ответчиков, когда это третье окно станет основным, а в то же время когда окно становится основным, потому что окно документа (возможно, последнее) закрыто.

+0

Привет, Питер, Большое спасибо за просвещение.Третье окно на самом деле также является частью документа, я не знаю, как мне удалось сделать это окно, не связанное с документами. Это действительно должно быть окно документа, как и второе окно. Итак, вопрос в том, почему это третье окно стало не связанным с документами окном? У меня есть идея. – wackazong

+0

Добавьте оконный контроллер окна в массив документов, отправив ему сообщение 'addWindowController:'. Возможно, вы захотите сделать это в своем подклассе 'makeWindowControllers' вашего NSDocument. –

0

Ну, оказывается, что я реализовал третье окно таким образом, что я создал его с помощью своего контроллера с помощью initWithNibFile, выполнил процедуру в контроллере и затем отправил команду [window close], потому что я не хотел ее показываться на экране. Это почему-то вытащило его из окна, связанного с документом, и не знаю, почему. Нет. Я перенесли эту конкретную вызываемую процедуру в сам контроллер документа, обработав окно, как второе окно и вуаля, он работает снова.

+0

Да, вам нужно создать экземпляр окна с помощью оконного контроллера и добавить его к оконным контроллерам документа. См. Мой комментарий к моему ответу. –

+0

Ну, я сделал это и раньше. Единственное различие, которое я вижу, это то, что я теперь создаю окно при первом его открытии. Раньше я создал его, а затем выпустил команду закрытия, чтобы скрыть ее снова, потому что я не хотел, чтобы она отображалась в начале программы. Затем окно отобразится с помощью команды show, но соединение с оконным контроллером кажется нарушенным, когда вы выдаете команду закрытия. – wackazong

Смежные вопросы