Dre*_*ack 16 cocoa nstabviewcontroller
我正在尝试使用故事板和新的NSTabViewController类为我的应用程序创建一个首选项面板.
我可以让它工作,但故事板中的转换设置似乎被忽略了.它只是从一个标签跳到下一个标签,窗口的大小瞬间变化.
我认为这可能取决于我是否使用autolayout,但是当我切换它时它似乎没有改变过渡行为.
我还检查了"传播标题"设置.我原本以为它将采用标签项的标签或视图控制器的标题,并将其作为窗口标题传播,但似乎并没有这样做.
有人这个上班吗?
这是我正在测试的简单示例应用程序:https://www.dropbox.com/s/roxaplxy5gtlqns/Again.zip?dl = 0
更新:感谢Pierre的工作.通过继承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
Run Code Online (Sandbox Code Playgroud)
Pie*_*ard 24
您需要使NSTabViewController成为NSTabView的委托.
在Interface Builder中,从无阴影选项卡视图控制拖动到选项卡视图控制器并设置代理插座.
人们期望Interface Builder在创建新的选项卡视图控制器时正确设置它.它不是.
请注意,在 Xcode 9 之前这都是正确的。 从 Xcode 9 开始,您需要删除(或不添加)这一行:
self.tabView.delegate = self
Run Code Online (Sandbox Code Playgroud)
否则你会收到一个错误:
*** 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
Run Code Online (Sandbox Code Playgroud)