我想在我的NSSplitViewController中使用自定义的NSSplitViewController。
文档说:
若要提供自定义拆分视图,请在继承的viewDidLoad()方法中调用Super时,即在拆分视图控制器的isViewLoaded属性为真之前,随时设置此属性。
我的NSSplitViewController子类称为MainVC。
在调用-viewDidLoad之前,我尝试在[super viewDidLoad]中设置自定义拆分视图
- (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
- (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?
发布于 2017-09-05 22:59:01
因此,索引超出界限的问题与您的拆分视图没有任何内容有关,而不是您在初始化时做错了什么。将初始化留在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;
}发布于 2018-01-05 22:49:49
这个线程中被接受的答案在技术上是正确的,但是(可以理解)错过了NSSplitViewController中的一个bug,而我在任何地方都没有发现这个错误。2017年可可的发展状况,我猜.
无论如何,问题是:如果您和我一样,想使用一个NSSplitViewController,并且只使用一个以一个视图开头的NSSplitView,那么上面的子类方法将无法工作,您将从OP中得到索引错误。有一种私有方法(用于绘制除法器),它假定两个NSSplitViewItem在任何时候都在其中,尽管NSSplitView只对一个很好。
最后我所做的是对NSSplitViewController和NSSplitView进行子类化,并提供一个检查,看看是否创建了一个只有一个视图的视图,并在一个空白的NSViewController实例中进行了交换,该实例一旦加载阶段结束,就会被移除。我还发现直接设置splitViewController.splitViewItems = ...并不是很好,您应该打电话给addSplitViewItem:来做这件事--想必有些事情在幕后是你错过的。
这个类是令人讨厌的没有文档记录,尽管它是相当有用的整体。如果你是一个任性的旅行者,你发现了这个,希望它有帮助。
发布于 2018-10-07 11:17:52
对我来说,这起作用了。(macOS 10.14,Xcode 10)
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()
}
}https://stackoverflow.com/questions/46016552
复制相似问题