Подтвердить что ты не робот

NSTabViewController игнорирует переходы и настройки распространения заголовков

Я пытаюсь создать панель настроек для своего приложения, используя раскадровки и новый класс NSTabViewController.

Я могу заставить его работать, но настройка перехода в раскадровке, похоже, игнорируется. Он просто перескакивает с одной вкладки на другую, причем размер окна меняется мгновенно.

Я думал, что это может зависеть от того, использую ли я автоопределение или нет, но он не изменил поведение перехода, когда я переключил его.

У меня также установлен параметр 'Propagates title'. Я ожидал, что он примет метку элемента вкладки или заголовок контроллера представления и распространит его как заголовок окна, но, похоже, это не так.

Кто-нибудь получил это, чтобы работать?

Вот пример простого примера, с которым я тестирую: https://www.dropbox.com/s/roxaplxy5gtlqns/Again.zip?dl=0

Обновление: Получил эту работу благодаря Пьеру. Завершено создание красивого окна настроек перехода путем подклассификации NSTabViewController следующим образом:

@implementation MCPreferencesTabViewController

-(void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
    [super tabView:tabView willSelectTabViewItem:tabViewItem];

    NSTabViewItem *currentTabItem = tabView.selectedTabViewItem;
    currentTabItem.view.hidden = YES;
    tabViewItem.view.hidden = YES;

    NSWindow *window = self.view.window;
    NSSize contentSize = tabViewItem.view.fittingSize;
    NSSize newWindowSize = [window frameRectForContentRect:(CGRect){CGPointZero, contentSize}].size;

    NSRect frame = [window frame];
    frame.origin.y += frame.size.height;
    frame.origin.y -= newWindowSize.height;
    frame.size = newWindowSize;

    [self.view.window setFrame:frame display:NO animate:YES];
}

- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
{
    [super tabView:tabView didSelectTabViewItem:tabViewItem];
    tabViewItem.view.hidden = NO;
}

@end
4b9b3361

Ответ 1

Вам нужно сделать NSTabViewController делегатом NSTabView.

В Interface Builder перетащите элемент управления из панели "Без теней" в "Просмотр таблиц" и установите выход делегата.

Можно было бы ожидать, что Interface Builder правильно настроит это при создании нового контроллера представления вкладок. Это не так.

Ответ 2

Или в viewDidLoad() для NSTabViewController, включите

    self.tabView.delegate = self

Ответ 3

Обратите внимание, что это было верно до Xcode 9. Поскольку Xcode 9, вам нужно удалить (или не добавить) эту строку:

self.tabView.delegate = self

в противном случае вы получите сообщение об ошибке:

*** Assertion failure in -[YourApp.CustomTabView setDelegate:],
/BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1561.0.100/AppKit.subproj/NSTabView.m:2766
2017-10-25 19:29:06.301282+0200 YourApp[23106:5687795] Failed to set (contentViewController) user defined inspected property on (NSWindow): 
A TabView managed by a TabViewController cannot have its delegate modified