16

我正在尝试使用情节提要和新的 NSTabViewController 类为我的应用程序创建一个首选项面板。

我可以让它工作,但故事板中的过渡设置似乎被忽略了。它只是从一个选项卡跳到下一个选项卡,窗口的大小会立即改变。

我认为这可能取决于我是否使用自动布局,但是当我切换它时它似乎并没有改变过渡行为。

我还检查了“传播标题”设置。我曾期望它会采用选项卡项的标签或视图控制器的标题,并将其作为窗口标题传播,但它似乎没有这样做。

有人让这个工作吗?

这是我正在测试的一个简单示例应用程序: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
4

3 回答 3

25

您需要使 NSTabViewController 成为 NSTabView 的委托。

在 Interface Builder 中,按住 Control 从 No Shadow Tab View 拖动到 Tab View Controller 并设置委托出口。

人们会期望 Interface Builder 在创建新的选项卡视图控制器时正确设置它。它不是。

于 2014-12-16T01:04:45.897 回答
5

请注意这在 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
于 2017-10-25T17:31:53.617 回答
1

或在viewDidLoad()for 中NSTabViewController,包括

    self.tabView.delegate = self
于 2016-05-12T00:44:57.013 回答