【问题标题】:performSegueWithIdentifier from a NSView subclass?performSegueWithIdentifier 来自 NSView 子类?
【发布时间】:2016-04-04 12:45:59
【问题描述】:

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

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

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

【问题讨论】:

  • 由于@IBActions 已连接到 First Responder,您不能在视图控制器中捕获操作并执行依赖于活动视图的操作。
  • 是的,但该操作取决于视图私有的信息 - 特别是 NSTableView 中的选择。我可以揭露它,但它似乎是错误的。
  • 通常您可以从 controller 中控制工作流,因为您可以访问视图。另一种方法是使用协议/委托模式将数据发送回控制器。
  • 如果您想了解为什么在这种情况下不这样做,请尝试在选项卡控制器中构建一个包含十几个视图的故事板布局,每个视图都有一个自定义 VC 和视图。正如我所做的那样,您会得出结论,弯曲对象模型的任何潜在痛苦都比尝试编辑产生的混乱要便宜。

标签: swift segue nsviewcontroller


【解决方案1】:
view.containingController.performSegue()

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

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

例如添加vc作为响应者:

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

例如扩展中包含控制器

extension NSView {

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

【讨论】:

  • 注意扩展名是从内存中写入的.. 可能有错误或语法错误,但你应该明白
  • 注意:实际上并非如此。代表会更清洁 IMO
  • 无论如何我都会接受这个,因为它需要几秒钟来实施并解决问题。是的,我知道我在滥用系统,但有时这比“以正确的方式”做的只读。这是一个例子。
【解决方案2】:

您可以这样做(请参阅 Daij-Djan 的回答),但这不是我推荐的,因为假设的程序员将使用您的代码,但不熟悉它(假设您在一年内: ) ) 可能会被这种行为吓到。

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

【讨论】:

  • 我 100% 同意 FreeNickname。我的更有趣:D
  • 好的,我明白了,但是如何在视图中设置委托?我不想在 VC 醒着时这样做,因为视图只会在它们在选项卡视图中可见时才会更新。
  • @MauryMarkowitz,如果您的视图控制器包含在 UITabBarViewController 中,您可以在 viewWillAppear(嵌套 VC)中设置委托,例如。或者在负责显示视图的代码部分中,如果它最初是隐藏的。
  • 好吧,这一切都在 OSX 中,但我明白你的意思。就可以了!
  • @MauryMarkowitz,哦,对,对不起)我主要做 iOS 开发,所以我暂时忘记了问题是关于 OS X 的)祝你好运! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多