Как модальный Windows Work
Можно сделать целое окно или панель выполненными модальным приложением способом, с помощью нормального машинного оборудования цикла событий приложения, но ограничив ввод модальным окном или панелью. Модальная работа полезна для окон и панелей, требующих внимания пользователя, прежде чем сможет продолжиться действие. Примеры включают сообщения об ошибках и предупреждения, а также операции, требующие ввода, такого как открытые диалоговые окна или диалоговые окна, применяющиеся к многократным окнам.
Существует два механизма для работы модальным приложением окном или панелью. Первое, и более простой, должен вызвать runModalForWindow:
метод NSApplication
, который монополизирует события для указанного окна до одного из stopModal
, abortModal
, или stopModalWithCode:
вызывается, обычно методом действия кнопки. stopModal
метод заканчивает модальное состояние окна или панели из цикла событий. Это не работает, если вызвано от метода, вызванного таймером или распределенным объектом, потому что те механизмы работают за пределами цикла событий. Для завершения модального цикла в этих ситуациях можно использовать abortModal
. stopModal
когда пользователь щелкает по кнопке OK (или эквивалентный), метод обычно вызывается abortModal
когда пользователь щелкает по Кнопке отмены (или нажимает Клавишу выхода). Эти два метода эквивалентны stopModalWithCode:
с надлежащим параметром.
Второй механизм для работы модальным окном или панелью, названной модальным сеансом, позволяет приложению выполнять длинную работу, в то время как это все еще отправляет события в окно или панель. Модальные сеансы особенно полезны для панелей, позволяющих пользователю отменять или изменять работу. Для начала модального сеанса вызвать beginModalSessionForWindow:
на приложении, устанавливающем окно для сеанса и возвращающем идентификатор, используемый для других управляющих сеансом методов. В этой точке приложение может работать в цикле, выполняющем работу, вызывая runModalSession:
на объекте приложения на каждой передаче так, чтобы незаконченные события могли быть диспетчеризированы модальному окну. Этот метод возвращает код, указывающий, должна ли работа продолжаться, остановитесь, или аварийное прекращение работы, обычно устанавливающееся методами, описанными выше для runModalForWindow:
. После того, как цикл завершает, можно удалить окно из экрана и вызвать endModalSession:
на приложении для восстановления нормального цикла событий.
Нормальное поведение модального окна или сеанса состоит в том, чтобы исключить все другие окна и панели от получения событий. Для окон и панелей, служащих общими вспомогательными средствами управления, такими как меню и панель Font, это поведение чрезмерно строго. Пользователь должен быть в состоянии использовать эквиваленты клавиши меню (такие как те для Сокращения и для Вставки) и изменить шрифт текста в модальном окне, и это требует, чтобы немодальные панели были в состоянии получить события. Поддерживать это поведение, NSWindow
разделите на подклассы переопределяет worksWhenModal
метод для возврата YES
. Это позволяет окну получать события от нажатия мыши и события клавиатуры, даже когда присутствует модальное окно. Если подкласс должен работать, когда модальное окно присутствует, это должен обычно быть подкласс NSPanel
, не NSWindow
.
Модальные окна и модальные сеансы обеспечивают разные уровни управления к приложению и пользователю. Модальные окна ограничивают все действие самим окном и любыми методами, вызванными из окна. Модальные сеансы позволяют приложению продолжать работу в то время как ввод принятия только через модальное окно сеанса. Вне этого можно использовать распределенные объекты выполнить фоновые работы в отдельном потоке, позволяя пользователю выполнить другие действия с любой частью приложения. Фоновый поток может связаться с основным потоком, позволив приложению вывести на экран состояние работы в немодальной панели, возможно включая средства управления, чтобы остановить или влиять на работу, как это происходит. Обратите внимание на то, что, потому что AppKit не ориентирован на многопотоковое исполнение, фоновый поток должен связаться с заданным объектом в основном потоке, поочередно взаимодействующем с AppKit.
Перед версией 10.6 OS X, если бы модальное окно было открыто, было бы предотвращено завершение приложения, если бы пользователь попытался завершить приложение того окна. Начиная в версии 10.6 OS X, можно вызвать setPreventsApplicationTerminationWhenModal:
со значением NO
, и окно не предотвратит завершение приложения, когда модальный. К текущей стоимости этого свойства можно получить доступ путем вызова preventsApplicationTerminationWhenModal
. Значение по умолчанию NO
.