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
Ответы
Ответ 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