所以我试图在窗口加载时立即执行segue,而不必单击按钮或执行任何操作。 segue是从视图控制器链接的,但是没有从窗口控制器链接,因为我一次只能从WindowController获得一个segue链接。我直接在“windowWillLoad”和“windowDidLoad”中尝试了这个代码,并使用它自己的函数。它没有进行过渡。它总是必须用按钮激活吗?我可以不使用没有直接链接到WindowController本身的segue吗?我基本上希望能够在启动cocoa mac app时在两个不同的视图控制器之间进行选择。
import Cocoa
class WindowOne: NSWindowController {
var i = 0
override func windowWillLoad() {
}
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
if i == 0 {
performSegueWithIdentifier("segone", sender: self)
} else {
performSegueWithIdentifier("segtwo", sender: self)
}
}
override func windowDidLoad() {
super.windowDidLoad()
}
}
答案 0 :(得分:1)
这里的问题是在窗口实际出现之前不能执行segue - 并且在windowDidLoad
被调用时它没有。
在iOS版本中,我们会通过performSegueWithIdentifier
方法调用viewDidAppear
来处理此问题。
根据这个答案,这里有两个选项:viewWillAppear or viewDidAppear on NSWindowController
覆盖showWindow
方法:
import AppKit
class WindowOne: NSWindowController {
var i = 1
override func showWindow(_ sender: Any?) {
super.showWindow(sender)
if i == 0 {
performSegueWithIdentifier("segone", sender: self)
} else {
performSegueWithIdentifier("segtwo", sender: self)
}
}
}
或者对于更细粒度的行为,可能会捕获NSWindowDelegate
个调用。例如,如果您希望每当窗口到达前台时都发生segue,您可以实现windowDidBecomeKey
:
import AppKit
class WindowOne: NSWindowController, NSWindowDelegate {
var i = 1
override func windowDidLoad() {
super.windowDidLoad()
self.window?.delegate = self
}
func windowDidBecomeKey(_ notification: Notification) {
if i == 0 {
performSegueWithIdentifier("segone", sender: self)
} else {
performSegueWithIdentifier("segtwo", sender: self)
}
}
}