我正在尝试实现一个类似于Xcode的NSSplitView,您可以通过将视图的句柄拖动到宽度的一半以下来折叠视图,视图将自动折叠。我让该部分正常工作,但当发生这种情况时,我需要更新工具栏中按钮的状态。我尝试侦听splitViewDidResizeSubviews并检查拆分视图的视图是否折叠,但该方法触发了16次,折叠的==为真,所以我不想16次更新按钮的状态。有没有更干净的方法来做这件事?我是Cocoa的新手,但从我所看到的情况来看,我希望有某种方法来说明将此按钮的状态绑定到isCollapsed属性并完成它。这样的事情真的存在吗?
发布于 2020-07-14 16:31:07
如果将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)")
}
}
}发布于 2016-06-13 03:40:28
查看可用的绑定的最好方法是检查文档,特别是Cocoa Bindings Reference (在侧边栏中查找您想要的视图)。

NSSplitView没有您所描述的绑定,所以我认为您当前的方法是正确的。当然,你不需要更新按钮的状态16次,只需每次检查它的值,并在需要时更新它。这可能看起来有点浪费,但检查bool的值是一个非常廉价的操作,而且您不会注意到任何类型的性能影响。
发布于 2019-09-04 14:41:27
当NSSplitView的一个子视图被“折叠”时,它没有event或observable属性,而immediate子视图本身将其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“折叠”视图的目的,但这在实践中发生的可能性很小。
https://stackoverflow.com/questions/37769287
复制相似问题