#swift #macos #modal-dialog #xib
#swift #macos #модальный диалог #xib
Вопрос:
ОС: macOS язык: Swift 4
Чего я хочу
Я хочу показать простой пользовательский модальный вид из моего главного окна. Этот пользовательский модальный вид я создал в отдельном файле .xib с принадлежащим классом NSWindowController.
В Xcode я добавил новый файл -> CocoaClass -> Подкласс NSWindowController -> Отмечен галочкой «Также создать файл XIB для пользовательского интерфейса»
Затем я добавил кнопку и сгенерировал обработчик действий, который просто печатает текст на консоли отладки. Это для проверки того, правильно ли обрабатывается нажатие кнопки или нет.
Чтобы отобразить модальный вид из моего главного окна, у меня есть следующий код, выполняемый при нажатии кнопки:
let modal = SimpleModal(windowNibName: "SimpleModal")
self.view.window?.beginSheet(modal.window!, completionHandler: { response in
print("Finished device selection")
})
Это действительно показывает вид, но не как модальный вид. Он просто показывает вид рядом с моим главным окном, и модальный вид также не реагирует на события щелчка мыши, когда я нажимаю на кнопку в модальном представлении.
Я не знаю, как это сделать правильно, поэтому, если вы знаете, как это сделать, пожалуйста, ответьте мне.
ПРИМЕЧАНИЕ:
При отображении модального вида главное окно не должно отвечать на запросы, пока пользователь не отключит модальный вид. Это похоже на перемещение фокуса с главного окна на модальный вид.
Источник моего демонстрационного проекта: OSXModalView
Комментарии:
1. developer.apple.com/documentation/appkit/nsapplication/…
2. Вы хотите отобразить модальное окно или лист?
3. @Willeke Я не знаю, в чем разница. Однажды я создал приложение macOS на Objective-C и создал модальный вид с помощью sheet. Кстати, вы можете посмотреть мой проект для получения более подробной информации. Насколько я понимаю, в macOS это модальный вид, то, что скользит вниз от верхней части главного окна. Я думаю, что именно так это должно работать в macOS, а не так, как в Windows, при появлении диалогового окна.
4. Модальное окно — это окно, подобное оповещению или диалоговому окну. Лист скользит вниз из верхней части окна. Контроллер вида можно представить в виде модального окна или листа. Смотрите presentAsModalWindow( 🙂 и presentAsSheet( 🙂 . Или просто добавьте контроллер вида в раскадровку с модальным переходом или sheet segue.
Ответ №1:
Вы должны удалить Visible At Launch
флаг в инспекторе атрибутов вашего объекта window в SimpleModal.xib
. В противном случае ваш код работает.
Комментарии:
1. Спасибо, это заставляет его вести себя как модальный! Еще одна вещь… (извините, Джобс), когда я нажимаю на кнопку в моем модальном представлении, он не вызывает обработчик действия. Итак, мой модальный вид не получает события щелчка (и, я думаю, другие события пользовательского интерфейса тоже). Как это решить? (Если все это работает, я принимаю ваш ответ)
2. Чтобы закрыть лист, просто отправьте вызов
dismiss
метода его контроллера представления. Лучшее место для этого — метод действия кнопки. Надеюсь, это поможет.3. Я уже делаю это, но еще раз, мой модальный вид не получает события щелчка, поэтому я даже не могу выполнить простую функцию print (), потому что обработчик действия вообще не вызывается. Спасибо.
4. мсчмидт, я решил это, но не помню, каким было окончательное решение, поэтому я оставляю ваш ответ как правильный 🙂