2011-02-05 3 views
0

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

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

Однако окно объявляется под делегатом приложения, а метод, связанный с кнопкой, объявляется в отдельном файле заголовка.

У кого-нибудь есть идеи, как я могу это сделать, любая помощь будет высоко оценена. Заранее спасибо, Сами.

ответ

1

Существует несколько решений в зависимости от архитектуры вашего приложения.

  1. Отправить [[NSApp mainWindow] makeKeyWindow], что сделает главное окно ключевым.

  2. Ваш делегат приложения может иметь ссылку на главное окно. В методе действий, который обрабатывает нажатие кнопки, вы можете попросить делегата приложения сделать ключевое окно ключевым. Делегат приложения отправит [mainWindow makeKeyWindow].

  3. Ваш делегат приложения может иметь ссылку на оконный контроллер, который управляет главным окном. В методе действий, который обрабатывает нажатие кнопки, вы можете попросить делегата приложения сделать ключевое окно ключевым. Делегат приложения попросит главного контроллера окна сделать это, и контроллер главного окна отправит [[self window] makeKeyWindow].

  4. Ваш делегат приложения может прослушивать уведомление NSWindowDidResignKeyNotification и хранить ссылку на последнее окно, в котором сбрасывается ключ. В методе действий, который обрабатывает нажатие кнопки, вы можете попросить делегата приложения вернуть статус ключа в это предыдущее окно. Делегат приложения должен будет игнорировать уведомления NSWindowDidResignKeyNotification, когда это окно является вашим вспомогательным окном. Это решение лучше, когда нет единого главного окна.

Если первое решение не применяется, а) приложение делегат может соответствовать протоколу, объявляющего метод, отвечающий за восстановление ключа статус надлежащего окна, или б) ваш метод действия может опубликовать уведомление информирующее приложение, которое завершил ваш метод действий, и попросите делегата приложения прослушать это уведомление и восстановить статус ключа в соответствующее окно.

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

+0

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

+0

@Sami В моем ответе описывается, как обращаться со своим вспомогательным окном, сбрасывающим статус ключа.Нет простого метода '-resignKey', потому что Cocoa не знает, какое другое окно должно стать ключевым, поэтому ваша ответственность за _make еще один ключ окна ._ –

+0

Обратите внимание, что' [NSApp mainWindow] 'просто означает самое раннее регулярное окно. 'NSApp' не имеет понятия, какое окно вы считаете своим« главным окном ». –