PerformSegueWithIdentifier没有进行转换

时间:2016-06-28 15:50:32

标签: xcode swift macos cocoa viewcontroller

所以我试图在窗口加载时立即执行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()


}

}

1 个答案:

答案 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)
        }

    }
}