来自 NSView 子类的 performSegueWithIdentifier?

performSegueWithIdentifier from a NSView subclass?

我有一个文档 window,其中包含许多 NSView 子类,它们在使用选项卡控件之间切换。每个子类和 window 的 ViewController 都支持通过与 First Responder 关联的菜单项访问的不同用户操作。

我想从其中一个 视图 执行 segue 以响应菜单项。但是,NSView 不支持 performSegueWithIdentifier,它似乎是 NSViewController 单独的一部分。

有人可以提出解决此问题的方法吗?我看到了将 VC 传递到视图中的建议,但我不清楚该怎么做。或者有更好的方法吗?

view.containingController.performSegue()

注意:您必须将 containingController 添加到您的视图中

我会将 viewController 添加到响应链,然后在扩展中使 containingController 成为一个计算 属性!

例如添加 vc 作为响应者:

override func awakeFromNib() {
    super.awakeFromNib()
    self.nextResponder = self.view
    for subview in self.view.subviews {
        subview.nextResponder = self
    }
}

例如containingController in extension

extension NSView {

    var containingController: NSViewController? { 
        get {
            while(self.nextResponder != nil) {
                if(self.nextResponder is NSViewController) {
                    return self.nextResponder
                }                
            }
            return nil
        }
    }
}

你可以这样做(参见 Daij-Djan 的回答),但这不是我推荐的,因为假设的程序员将使用你的代码,但不熟悉它(比方说,你在year :) ) 可能会被这种行为吓到。

我建议您使用 viewRequiresToPerformTransition(view: YourViewSubclass) 之类的方法向您的 NSView 添加一个委托(符合您的自定义协议,我们称之为 MyViewDelegate)。然后你在你的视图控制器中实现这个方法(更一般地说,你符合 MyViewDelegate 协议)并在它的实现中执行你想要的任何 segue。