如何使用NSSplitViewController设置自定义的NSSplitView?

问题描述:

我想在自己的NSSplitViewController上使用自定义NSSplitView如何使用NSSplitViewController设置自定义的NSSplitView?

docs说:

To provide a custom split view, set this property at any time before you call super in the inherited viewDidLoad() method; that is, before the split view controller’s isViewLoaded property is true.

NSSplitViewController子类被称为MainVC

我试着设置我的自定义分屏视图中-viewDidLoad调用[super viewDidLoad]前:

- (void)viewDidLoad { 
    self.splitView = [MySplitView new]; 
    [super viewDidLoad]; 
    // Rest of viewDidLoad... 
} 

,但没有奏效。我得到了以下错误:

2017-09-02 10:35:43.527312-0700 Zee[6497:632581] ** * Assertion failure in -[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: The -splitView can only be assigned before the view is loaded

我也试着重写loadView

- (void)loadView { 
    self.splitView = [MySplitView new]; 
    [super loadView]; 
} 

,但我得到:

2017-09-02 10:39:39.377345-0700 Zee[6575:639146] ** * -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array

如果我打电话[super loadView]后做作业,我得到相同错误,正如我在-viewDidLoad中尝试过的那样。

如何在我的NSSplitViewController子类中使用自定义NSSplitView

+1

为什么你觉得需要使用NSSplitViewController进行自定义分割视图?你想通过继承NSSplitView和NSSplitViewController获得什么? –

+0

@LucasDerraugh我想定制分隔符和子类的外观NSSplitView似乎是做到这一点的方式。 – sam

因此,索引越界问题与您的拆分视图没有任何内容相关,而不是您在初始化时做错的事情。在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(理解)错过了一个错误,我没有发现任何相关文档。这就是可可的发展状况在2017年,我猜...

无论如何,这个问题是这样的:如果你和我一样,想用的NSSplitViewControllerNSSplitView开始只有一个观点,上面的子类方法将不起作用,您将从OP得到索引错误。有一种私人方法(用于绘制分频器),假设NSSplitViewItem在任何时候都在那里,即使NSSplitView只用一个就可以正常工作。

我最终什么事做的是既继承和NSSplitViewControllerNSSplitView,并提供了如果我创建一个只有一个视图和一次加载阶段已经安顿下来已移除的空白NSViewController实例交换支票。我还发现设置splitViewController.splitViewItems = ...直接不能很好地工作,你应该打电话到addSplitViewItem:来做到这一点 - 大概有一些幕后的东西,否则你错过了。

这个类令人讨厌,没有文档记录,尽管它总体上非常有用。如果你是一个任性的旅行者,你发现这一点,希望它有帮助。

+0

感谢您的额外颜色。 – sam