NSWindow не отвечает на нажатия клавиш - PullRequest
0 голосов
/ 17 декабря 2009

Это может быть очень просто, но я не могу найти это:

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

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

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2009

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

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

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

Эта проблема не характерна для сохранения - она ​​затрагивает все сообщения действий, которые должны пройти к объекту документа. Еще один важный пример - «Печать». Пользователь, скорее всего, будет печатать документ, а не третье окно.

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

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

2 голосов
/ 17 декабря 2009

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

0 голосов
/ 17 декабря 2009

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

...