首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NSSplitView设置自定义NSSplitViewController?

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

Stack Overflow用户
提问于 2017-09-02 17:46:57
回答 4查看 1.6K关注 0票数 4

我想在我的NSSplitViewController中使用自定义的NSSplitViewController

文档说:

若要提供自定义拆分视图,请在继承的viewDidLoad()方法中调用Super时,即在拆分视图控制器的isViewLoaded属性为真之前,随时设置此属性。

我的NSSplitViewController子类称为MainVC

在调用-viewDidLoad之前,我尝试在[super viewDidLoad]中设置自定义拆分视图

代码语言:javascript
复制
- (void)viewDidLoad {
    self.splitView = [MySplitView new];
    [super viewDidLoad];
    // Rest of viewDidLoad...
}

但没起作用。我得到了以下错误:

2017年-09-02 10:35:43.527312-0700 Zee6497:632581 ** /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit- 1561/Controllers/NSSplitViewController.m:220 * -MainVC setSplitView:,*断言失败 2017-09-02 10:35:43.527558-0700 The 6497:632581 MainVC:-splitView只能在视图加载之前分配。

我也尝试过重写loadView

代码语言:javascript
复制
- (void)loadView {
    self.splitView = [MySplitView new];
    [super loadView];
}

但我明白:

2017年-09-02 10:39:39.377345-0700 for 6575:639146 ** * -__NSArrayM objectAtIndex:索引0超出空白数组的界限

如果在调用[super loadView]之后执行分配,则会得到与在-viewDidLoad中尝试时相同的错误。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-05 22:59:01

因此,索引超出界限的问题与您的拆分视图没有任何内容有关,而不是您在初始化时做错了什么。将初始化留在loadView中应该是可以的。在表示NSSplitViewController子类之前,只需确保您已经用至少2 NSSplitViewItems初始化了它。下面是一个例子:

代码语言:javascript
复制
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    MySplitViewController *vc = [MySplitViewController new];
    vc.splitViewItems = @[
        [NSSplitViewItem splitViewItemWithViewController:[MyViewController new]],
        [NSSplitViewItem splitViewItemWithViewController:[MyViewController new]]
    ];
    self.window.contentViewController = vc;
}
票数 3
EN

Stack Overflow用户

发布于 2018-01-05 22:49:49

这个线程中被接受的答案在技术上是正确的,但是(可以理解)错过了NSSplitViewController中的一个bug,而我在任何地方都没有发现这个错误。2017年可可的发展状况,我猜.

无论如何,问题是:如果您和我一样,想使用一个NSSplitViewController,并且只使用一个以一个视图开头的NSSplitView,那么上面的子类方法将无法工作,您将从OP中得到索引错误。有一种私有方法(用于绘制除法器),它假定两个NSSplitViewItem在任何时候都在其中,尽管NSSplitView只对一个很好。

最后我所做的是对NSSplitViewControllerNSSplitView进行子类化,并提供一个检查,看看是否创建了一个只有一个视图的视图,并在一个空白的NSViewController实例中进行了交换,该实例一旦加载阶段结束,就会被移除。我还发现直接设置splitViewController.splitViewItems = ...并不是很好,您应该打电话给addSplitViewItem:来做这件事--想必有些事情在幕后是你错过的。

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

票数 6
EN

Stack Overflow用户

发布于 2018-10-07 11:17:52

对我来说,这起作用了。(macOS 10.14,Xcode 10)

代码语言:javascript
复制
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()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46016552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档