Как правильно отобразить модальный вид из файла xib в macOS?

#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. мсчмидт, я решил это, но не помню, каким было окончательное решение, поэтому я оставляю ваш ответ как правильный 🙂