NSSplitView折叠事件

时间:2016-06-11 23:12:43

标签: cocoa nssplitview

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

3 个答案:

答案 0 :(得分:0)

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

enter image description here

NSSplitView没有您描述的绑定,所以我认为您使用当前的方法是正确的。当然,您不需要更新按钮的状态十六次,每次只需检查它的值,并在需要时更新它。这可能看起来有点浪费,但检查一个bool的值是一个非常便宜的操作,你不会注意到任何性能损失。

答案 1 :(得分:0)

NSSplitView的某个子视图被“折叠”时,没有事件或可观察的属性时,直接子视图本身的hidden属性将设置为YES

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

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

-(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“折叠”您的视图,但这是在实践中几乎不可能发生。

答案 2 :(得分:0)

如果您将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)")
        }
    }

}