因此,我尝试在窗口加载后立即执行转场,而无需单击按钮或执行任何操作。 Segue 是从 View Controller 链接的,但不是从窗口 Controller 链接的,因为我一次只能从 Windowcontroller 链接一个 Segue。我直接在“windowWillLoad”和“windowDidLoad”中尝试了这段代码,并使用它自己的函数。它没有进行转变。是否总是需要通过按钮来激活?我可以不使用未直接链接到 WindowController 本身的 segue 吗?我基本上希望能够在启动 cocoa mac 应用程序时在两个不同的 View Controller 之间进行选择。
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()
}
}
最佳答案
这里的问题是,在窗口实际出现之前,segue 无法执行 - 而在 windowDidLoad
被调用时,它还没有被调用。
在 iOS 领域,我们将通过在 viewDidAppear
方法中调用 performSegueWithIdentifier
来处理此问题。
这里有两个选项,根据这个答案: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
调用。例如,如果您希望每当窗口到达前台时就发生转场,您可以实现 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)
}
}
}
关于xcode - PerformSegueWithIdentifier 未进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38080843/