Да, это возможно.Но для этого нужна проводка.
Сначала добавьте пользовательский подкласс NSSplitViewItem
и выставьте свойство viewController
в качестве IBOutlet.Компилятор выдаст предупреждение, поэтому не забудьте пометить свойство как динамическое.
@interface MySplitViewItem : NSSplitViewItem
@property IBOutlet NSViewController *viewController;
@end
@implementation MySplitViewItem
@dynamic viewController;
@end
В XIB добавьте 3 объекта NSViewController.Один из них меняется на пользовательский класс NSSplitViewController.Важно отметить, что НЕ следует добавлять NSSplitView
.Подключите NSViewControllers
к views
.Также добавьте 2 объекта и добавьте пользовательский класс MySplitViewItem
, который выставил viewController
и подключил его.
Последний шаг.Важно установить свойство splitItems
из NSSplitViewController
до загрузки представлений!В противном случае вы попадаете с макросом NSAssert.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSNib *nib = [[NSNib alloc] initWithNibNamed:@"Empty" bundle:nil];
NSMutableArray *test = [NSMutableArray new];
NSMutableArray *splitItems = [NSMutableArray new];
NSSplitViewController *controller;
[nib instantiateWithOwner:self topLevelObjects:&test];
for (id object in test) {
if ([object isKindOfClass:[NSSplitViewController class]]) {
controller = object;
}
if ([object isKindOfClass:[NSSplitViewItem class]]) {
[splitItems addObject:object];
}
}
[controller setValue:splitItems forKey:@"splitViewItems"];
[[self window] setContentViewController:controller];
}
Вот доказательство того, что все подключено правильно.Обратите внимание, что я не трогал делегат в XIB, и он подключен.Магия, я знаю.
PS: XIB должен быть установлен так, чтобы он предпочитал Coder + auto layout.
Почему я предпочитаю XIB?Потому что мы можем создать более крупный XIB, который не страдает от изоляции данных (легко может делать привязки через NSViewControllers).
Я также экспериментировал, чтобы добавить splitViewItems
в viewDidLoad
или setView
или awakeFromNib
: в пользовательский подкласс NSSplitViewController
(с открытыми свойствами NSSplitViewItem).Если кто-то найдет здесь решение, он будет очень признателен.
Решение, для которого требуется только код:
- (NSSplitViewController *)profilesSVC
{
if (!_profilesSVC) {
NSSplitViewController *splitVC = [[NSSplitViewController alloc] init];
ProfilesViewController *profilesVC = [[ProfilesViewController alloc] initWithNibName:@"Profiles" bundle:nil];
NSSplitViewItem *leftItem = [NSSplitViewItem splitViewItemWithViewController:profilesVC];
[splitVC addSplitViewItem:leftItem];
ProfileViewController *profileVC = [[ProfileViewController alloc] initWithNibName:@"Profile" bundle:nil];
NSSplitViewItem *rightItem = [NSSplitViewItem splitViewItemWithViewController:profileVC];
[splitVC addSplitViewItem:rightItem];
_profilesSVC = splitVC;
}
return _profilesSVC;
}