我有一个文档窗口,其中包含许多NSView子类,使用选项卡控件进行切换。每个子类和窗口的ViewController都支持通过绑定到First Responder的菜单项访问的不同用户操作。
我想从其中一个视图执行一个segue以响应菜单项。但是,NSView不支持performSegueWithIdentifier
,它似乎只是NSViewController的一部分。
有人可以提出解决方法吗?我已经看到了将VC传递给视图的建议,但我不清楚如何做到这一点。或许还有更好的方法?
答案 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。