Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何使用NSSplitViewController设置自定义NSSplitView?_Macos_Cocoa_Appkit_Nssplitview_Nssplitviewcontroller - Fatal编程技术网

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()
    }
}