我正在尝试实现类似于Xcode的NSSplitView,您可以通过将其手柄拖动到其宽度的一半以下来折叠视图,它将自动折叠。我有那个部分工作,但我需要在发生这种情况时更新工具栏中按钮的状态。我试着收听splitViewDidResizeSubviews并检查splitView的视图是否已折叠,但该方法在折叠== true时触发16次,所以我不认为我想要更新按钮的状态16倍。有更清洁的方法吗?我是Cocoa的新手,但从我所看到的情况来看,我希望有一些方法可以将这个按钮的状态绑定到isCollapsed属性并完成它。这样的事情存在吗?
答案 0 :(得分:0)
查看可用绑定的最佳方法是检查文档,特别是Cocoa Bindings Reference(在侧边栏中查看您正在查看的视图)。
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)")
}
}
}