Представить модальность из NSWindowController без использования раскадровок

#swift #xib #nsviewcontroller #nswindowcontroller

#swift #xib #nsviewcontroller #nswindowcontroller

Вопрос:

Я создаю фреймворк macOS, который запускается в начале процесса входа в систему, и я хочу показать некоторую информацию пользователю в окне. У меня есть NSWindowController с файлом .XIB, и это главное окно для моей платформы.

Я хотел бы добавить больше presentAsSheet в другое представление. Для этого я создал NSViewController с .XIB, чтобы определить пользовательский интерфейс, который я хочу представить в модальном, но здесь я полностью заблокирован, потому что получение contentViewController окна всегда равно нулю

Я инициализирую свое главное окно следующим образом:

 func run() {
  NSApp.activate(ignoringOtherApps: true)
  mainWC = MainWC(windowNibName: "MainWC")
  guard mainWC.window != nil else {
    return
  }
  NSApp.runModal(for: mainWC.window!)
}
  

Где я пытаюсь представить другой NSViewController «

 self.window?.contentViewController?.presentAsSheet(customViewController)
  

В моем MainWindowController я делаю это:

 @IBAction func btnAction(_ sender: Any) {
  let customModal = CustomModal(windowNibName: "CustomModal")
  self.window?.beginSheet(customModal.window!, completionHandler: { code in
    print(message: "Clicked")
  })
}
  

Модальный никогда не появляется

Ответ №1:

Вы не можете представить представление, пока окно и представление содержимого не будут загружены

Либо внутри контроллера окна в windowDidLoad()

 override func windowDidLoad() {
    super.windowDidLoad()
    // present the view
}
  

или даже в viewDidLoad контроллере представления

 override func viewDidLoad() {
    super.viewDidLoad()
    // present the view
}
  

Комментарии:

1. @AlexGonzalez Интересно, решили ли вы эту проблему. Я сталкиваюсь с аналогичной проблемой. Я создаю плагин авторизации для macOS. Я не могу загрузить NSViewController внутри NSWindow.

2. @iBuilt Вы нашли какое-либо решение?

3. @AlexGonzalez Да, я сделал. Я инициализировал ViewController внутри метода. Я сделал объект ViewController глобальной переменной в классе и инициализировал его в методе viewDidLoad, и он отлично сработал.