Поддержка NSSplitViewController / NSSplitViewItem в XIB - PullRequest
0 голосов
/ 25 февраля 2019

Есть ли поддержка NSSplitViewController / NSSplitViewItem для XIB?Я вижу только NSSplitView

Могу ли я просто перетащить NSViewController и создать его подкласс как NSSplitViewController?Как добавить NSSplitViewItem, который в основном работает «из коробки»?

Split View Controller in XIB

Я легко вижу их поддержку в раскадровках.

Split View Controller in Storyboard

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Да, это возможно.Но для этого нужна проводка.

Result

Сначала добавьте пользовательский подкласс 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 и подключил его.

XIB

Последний шаг.Важно установить свойство 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, и он подключен.Магия, я знаю.Result

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;
}
0 голосов
/ 26 февраля 2019

Контроллер разделенного представления не является частью библиотеки объектов для файлов XIB.Самый простой способ использовать контроллеры с разделенным видом - это использовать раскадровки.

Если вы не хотите использовать раскадровки, лучше всего создать подкласс NSSplitViewController и установить флажок, чтобы также создать файл xib.

enter image description here

Добавить разделенное представление в файл Xib контроллера разделенного представления.Напишите код для загрузки xib-файла для настройки контроллера разделения представления.

ОБНОВЛЕНИЕ

Посмотрите ссылку на класс NSNib для получения информации о загрузке файла XIB.Владельцем файла xib-файла является ваш подкласс NSSplitViewController.Возможно, вы сможете использовать эту информацию для установки контроллера разделенного представления.В худшем случае вам нужно написать код для загрузки разделенного представления из xib-файла, установить разделенное представление контроллера разделенного представления на загруженное разделенное представление и добавить элементы разделенного представления в контроллер разделенного представления.См. Ссылку на класс NSSplitViewController для получения дополнительной информации.

...