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

Я работаю со Swift 4 для MacOS, и я могу программно показать другой контроллер представления с этим кодом:

@IBAction func showVC(_ sender: NSButton) {
    let vc = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "MyVC")) as! NSViewController
    self.presentViewController(vc, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: .maxX, behavior: .transient)
}

Теперь я хотел бы сделать то же самое с NSWindowController, но я получаю ниже "ошибка":

value of type 'WindowController' has no member 'presentViewController'

Есть ли другой способ реализовать это?

Следующая попытка

   @IBAction func showVC(_ sender: NSToolbarItem) {
    let vc = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "MyVC")) as! NSViewController
self.contentViewController?.presentViewController(x, asPopoverRelativeTo: sender.view!.bounds, of: sender.view!, preferredEdge: .maxX, behavior: .transient)

    }        

приложение вылетает во второй строке с:

fatal error: unexpectedly found nil while unwrapping an Optional value

я проверяю следующее:

print(sender.view?.bounds ?? "No bounds")
print(sender.view ?? "No view")

Результат печати

No bounds
No view

Но почему??

1 ответ

Попробуй это:

let storyBoard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
let mainViewController : NSViewController = storyBoard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "myVC")) as! NSViewController
self.contentViewController!.presentViewController(mainViewController, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: .maxY, behavior: .transient)
Другие вопросы по тегам