Macos 如何使用NSSplitViewController设置自定义NSSplitView?
我想将自定义的Macos 如何使用NSSplitViewController设置自定义NSSplitView?,macos,cocoa,appkit,nssplitview,nssplitviewcontroller,Macos,Cocoa,Appkit,Nssplitview,Nssplitviewcontroller,我想将自定义的NSSplitView与我的NSSplitView控制器一起使用 他们说: 若要提供自定义拆分视图,请在之前的任何时间设置此属性 在继承的viewDidLoad()方法中调用super;就是之前, 拆分视图控制器的isViewLoaded属性为true 我的NSSplitViewController子类被称为MainVC 在调用[super viewDidLoad]之前,我尝试在-viewDidLoad中设置自定义拆分视图: - (void)viewDidLoad { se
NSSplitView
与我的NSSplitView控制器一起使用
他们说:
若要提供自定义拆分视图,请在之前的任何时间设置此属性
在继承的viewDidLoad()方法中调用super;就是之前,
拆分视图控制器的isViewLoaded属性为true
我的NSSplitViewController
子类被称为MainVC
在调用[super viewDidLoad]
之前,我尝试在-viewDidLoad
中设置自定义拆分视图:
- (void)viewDidLoad {
self.splitView = [MySplitView new];
[super viewDidLoad];
// Rest of viewDidLoad...
}
但它不起作用。我得到了以下错误:
2017-09-02 10:35:43.527312-0700 Zee[6497:632581]****
[MainVC setSplitView:]中出现故障,
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-
1561/Controllers/NSSplitViewController.m:220
2017-09-02 10:35:43.527558-0700 Zee[6497:632581]MainVC:
-只能在加载视图之前分配splitView
我还尝试覆盖loadView
:
- (void)loadView {
self.splitView = [MySplitView new];
[super loadView];
}
但我得到:
2017-09-02 10:39:39.377345-0700 Zee[6575:639146]***-[uuu NSArrayM]
objectAtIndex::索引0超出空数组的界限
如果我在调用[super loadView]
后执行分配,我会得到与在-viewDidLoad
中尝试时相同的错误
如何在我的NSSplitViewController
子类中使用自定义的NSSplitView
?因此索引越界问题与您的拆分视图没有任何内容有关,而不是与初始化有关。将初始化留在loadView中应该可以。在显示NSSplitViewController子类之前,只需确保已使用至少2个NSSplitViewItems初始化了该子类。下面是一个例子:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
MySplitViewController *vc = [MySplitViewController new];
vc.splitViewItems = @[
[NSSplitViewItem splitViewItemWithViewController:[MyViewController new]],
[NSSplitViewItem splitViewItemWithViewController:[MyViewController new]]
];
self.window.contentViewController = vc;
}
此线程中公认的答案在技术上是正确的,但(可以理解)在NSSplitViewController
中遗漏了一个我在任何地方都没有发现的bug。这就是2017年可可发展的状况,我想
无论如何,问题是:如果你像我一样,想使用一个带有一个视图的NSSplitViewController
的NSSplitView
,上面的子类化方法将不起作用,你会从OP中得到索引错误。有一个私有方法(用于绘制分隔符)这假设两个NSSplitViewItem
始终在其中,即使只有一个NSSplitView
可以正常工作
我最后做的是将NSSplitViewController
和NSSplitView
都子类化,并检查是否创建了一个只有一个视图的实例,并在加载阶段结束后将其替换到一个空的NSViewController
实例中。我还发现直接设置splitViewController.splitViewItems=…
效果不好,您应该通过调用addSplitViewItem:
来实现这一点,否则您可能会错过一些幕后的东西
令人烦恼的是,这个类没有文档记录,尽管它总体上非常有用。如果你是一个任性的旅行者,并且你发现了这一点,希望它能有所帮助。在我的情况下,这是有效的。(macOS 10.14,Xcode 10)
为什么您觉得需要使用NSSplitViewController创建自定义分割视图?子类化NSSplitView和NSSplitViewController有什么好处?@LucasDerraugh我想自定义分隔器的外观,子类化NSSplitView似乎是实现这一点的方法。感谢提供额外的颜色。
final class SplitVC: NSSplitViewController {
private func patch() {
let v = NSSplitView()
v.isVertical = true
v.dividerStyle = .thin
splitView = v
splitViewItems = [
NSSplitViewItem(viewController: NSTabViewController()),
NSSplitViewItem(viewController: NSTabViewController()),
]
}
override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
patch()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
patch()
}
}