来自NSView子类的performSegueWithIdentifier?

时间:2016-04-04 12:46:00

标签: swift segue nsviewcontroller

我有一个文档窗口,其中包含许多NSView子类,使用选项卡控件进行切换。每个子类和窗口的ViewController都支持通过绑定到First Responder的菜单项访问的不同用户操作。

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

有人可以提出解决方法吗?我已经看到了将VC传递给视图的建议,但我不清楚如何做到这一点。或许还有更好的方法?

2 个答案:

答案 0 :(得分:3)

view.containingController.performSegue()

注意:您必须在视图中添加containsController

我将把viewController添加到响应者链中,然后使containsController成为扩展中的计算属性!

e.g。添加vc作为响应者:

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

e.g。包含扩展程序中的控制器

extension NSView {

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

答案 1 :(得分:1)

你可以这样做(参见Daij-Djan的回答),但是这不是我推荐的,因为一个假设的程序员会使用你的代码,但不熟悉它(比方说,你在一年内: ))这种行为可能会让人感到意外。

我建议您使用类似MyViewDelegate的方法将代理人(符合您的自定义协议,我们称之为NSView)添加到您的viewRequiresToPerformTransition(view: YourViewSubclass)。然后在视图控制器中实现此方法(更一般地,您符合MyViewDelegate协议),并在其实现内部执行您想要的任何segue。