【问题标题】:NSSplitView Collapse EventNSSplitView 折叠事件
【发布时间】:2020-07-14 16:31:06
【问题描述】:

我正在尝试实现一个类似于 Xcode 的 NSSplitView,您可以通过将其手柄拖动到其宽度的一半以下来折叠视图,它会自动折叠。我有这部分工作,但发生这种情况时,我需要更新工具栏中按钮的状态。我尝试收听 splitViewDidResizeSubviews 并检查 splitView 的视图是否折叠,但是该方法在折叠 == true 的情况下触发了 16 次,所以我不认为我想更新按钮的状态 16 次。有没有更清洁的方法来做到这一点?我是 Cocoa 的新手,但据我所见,我希望有某种方法可以将此按钮的状态绑定到 isCollapsed 属性并完成它。有这种事吗?

【问题讨论】:

  • 一个拆分视图可以有许多可折叠的子视图,因此 NSSplitView 没有一个 isCollapsed 属性。

标签: cocoa nssplitview


【解决方案1】:

如果您将NSSplitViewController 子类化,您可以为SplitViewItem 的isCollapsed 属性添加一个侦听器:

class MySplitViewController: NSSplitViewController {

    var observer: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.

        let sideViewSplitViewItem = splitViewItems[0]

        observer = sideViewSplitViewItem.observe(\.isCollapsed, options: [.initial, .new]) {splitViewItem, _ in
            print("Sidebar collapsed state changed to: \(splitViewItem.isCollapsed)")
        }
    }

}

【讨论】:

    【解决方案2】:

    查看可用绑定的最佳方法是查看文档,特别是Cocoa Bindings Reference(查看侧边栏中的视图)。

    NSSplitView 没有您描述的绑定,所以我认为您目前的方法是正确的。当然,您不需要更新按钮的状态16次,每次检查它的值,如果需要更新它。这看起来有点浪费,但检查 bool 的值是一种非常便宜的操作,而且您不会注意到任何形式的性能损失。

    【讨论】:

      【解决方案3】:

      虽然NSSplitView 在其中一个子视图“折叠”时没有事件或可观察属性,但直接子视图本身的hidden 属性将设置为YES

      因此,您可以自己观察子视图的 hidden 属性,或者如果您正在创建自己的 NSView 自定义子视图,则可以覆盖 -(void) setHidden:(BOOL)hidden 以捕获事件。

      我做后者,每次都能正常工作。

      -(void)setHidden:(BOOL)hidden
      {
          [super setHidden:hidden];
      
          // Insert code to react to the "collapsed" event here.
          // (You're likely going to tell your parent view,
          // self.window.windowController, or something.)
      }
      

      当然,setHidden 方法/hidden 属性可以在理论上被调用,而不是从NSSplitView“折叠”您的视图,但这不太可能发生在练习。

      【讨论】:

        猜你喜欢
        • 2018-07-09
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        相关资源
        最近更新 更多