gpt4 book ai didi

cocoa - 如何在 NSTabView 中设置初始 View ?

转载 作者:行者123 更新时间:2023-12-03 17:03:37 26 4
gpt4 key购买 nike

我看过其他SO问题,但看不到我需要的帮助:我有一个Cocoa应用程序,其中NSViewControllers在NSTabView中子类化。

一切正常,除了 - 当我第一次运行应用程序时,选项卡 0 内容不显示。当我选择选项卡 1,然后选择选项卡 0 时,选项卡 1 显示,选项卡 0 显示正常。

我需要一些关于如何初始化选项卡 View 的建议,因为我猜我正在做一些奇怪的事情。

这就是我到目前为止正在做的事情:

    - (void)windowDidLoad
{

NSLog(@"%s", __FUNCTION__);
NSViewController *newController = nil;
newController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];
NSTabViewItem *item;
[[self aTabView] selectFirstTabViewItem:newController];
newController.view.frame = aTabView.contentRect;
[item setView:firstViewController.view];
self.currentViewController = newController;
}

更新,根据 Peter Hosey 的精彩评论,我的工作代码如下:

- (void)windowDidLoad
{

NSLog(@"%s", __FUNCTION__);

firstViewController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];

secondViewController = [[SecondViewController alloc]
initWithNibName:@"SecondViewController" bundle:nil];
thirdViewController = [[ThirdViewController alloc]
initWithNibName:@"ThirdViewController" bundle:nil];

NSTabViewItem *item;
if (firstViewController != nil) {
item = [aTabView tabViewItemAtIndex:0];
[item setView:[[self firstViewController] view]];
//[firstViewController.view.frame = aTabView.contentRect];
self.currentViewController = firstViewController;
}
}




- (BOOL)switchViewController:(NSTabView*)tabView item:(NSTabViewItem*)nextItem {
NSLog(@"%s", __FUNCTION__);
NSViewController *newController = nil;
newController.view = NO;
// assume a different identifier has been assigned to each tab view item in IB
itemIndex = [tabView indexOfTabViewItemWithIdentifier:[nextItem identifier]];
switch (itemIndex) {
case 0:
newController = firstViewController;
break;
case 1:
newController = secondViewController;
break;
case 2:
newController = thirdViewController;
break;
}
if (newController != nil) {
[nextItem setView:newController.view];
newController.view.frame = tabView.contentRect;
self.currentViewController = newController;

/*
NSLog(@"%s: myTabView.contentRect=%@ currentViewController.view.frame=%@",
__FUNCTION__, NSStringFromRect(aTabView.contentRect),
NSStringFromRect(currentViewController.view.frame));
*/
return YES;
}
else {
// report error to user here
NSLog(@"Can't load view for tab %ld", (long)itemIndex);
return NO;
}
}

- (BOOL)tabView:(NSTabView*)tabView shouldSelectTabViewItem:(NSTabViewItem*)tabViewItem {
return [self switchViewController:tabView item:tabViewItem];
}

最佳答案

    NSViewController *newController = nil;
newController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];

此声明和语句可以合并为一个带有初始值设定项的声明。

initwindowDidLoad 方法中执行此操作没有意义;您创建两个单独的 FirstViewController。

    NSTabViewItem *item;

您永远不会创建 NSTabViewItem 并将其分配给此变量。如果您期望 selectFirstTabViewItem: 消息执行此操作,(1) 不,那不是 what that does (2) 它不可能做到这一点,因为它不知道你的变量,甚至不知道你有一个变量。

在 ARC 下,该变量被隐式初始化为 nil,因此所有尝试使用此处项目的后续消息将不执行任何操作。如果您没有使用 ARC,则当您尝试使用它时,初始化此变量失败将导致(可能是间歇性的)崩溃。

     [[self aTabView] selectFirstTabViewItem:newController];

在这里传递你 Shiny 的新 View Controller (其中之一)不会做我认为你认为它会做的事情。

selectFirstTabViewItem: 是一个操作方法;它的参数是消息的发送者,通常应该是一个控件或菜单​​项。当您将其设置为按钮、菜单项等的操作时,该按钮/菜单项/无论什么都将是发送者。

将 View Controller 作为发送者传递是没有意义的。此外, selectFirstTabViewItem: 不会更改第一个选项卡 View 项目(如果有的话)的任何内容,并且它绝对不会假设或检查其发送者是 VC,如果是,则设置项目的 View VC 认为。它选择第一个选项卡 View 项(使其成为当前选项卡),仅此而已。

这个方法很可能会忽略它的参数。如果要将第一个选项卡 View 项的 View 设置为 VC 的 View ,则必须自己执行此操作。当然,您必须首先获取(或创建)选项卡 View 项。

    [item setView:firstViewController.view];

在 ARC 下,这不会执行任何操作;在 MRC 下,它可能会崩溃(见上文)。

你需要做什么

我假设这段代码来自 NSWindowController 子类。我进一步假设这个厕所有一个 Nib 。

  • 确保 aTabView 是一个 socket 并且已连接到 WC 的 Nib 中。 aTabView 应该是一个使用 IBOutlet 关键字声明的简单属性。不要为其实现任何自定义访问器方法;只需声明该属性,将其连接到 nib 中,然后在代码中访问它即可。
  • 在同一个地方创建 View Controller ,并确保只执行一次(不在 initWithWindow:windowDidLoad 中或从中创建) )。您可以在窗口 Controller 的 Nib 中创建所有 VC。不要忘记设置它们的类名(如果您有它们的 NSVC 子类)和 Nib 名称。
  • 在 Nib 中创建的选项卡 View 将至少有一个选项卡 View 项。我建议您在那里创建所有项目,并在运行时简单地替换它们的 View (使用 VC 的 View )。
  • 您应该在 windowDidLoad 中将选项卡 View 的项目替换为 VC 的 View 。确保窗口未设置为初始可见;仅在填充至少第一个选项卡 View 项后才需要显示它。

关于在 Nib 中创建的选项卡 View 的一个注释:最初可见的项目(选项卡)是您在 Nib 中可见的项目。确保在保存之前将选项卡 View 切换回其第一个选项卡。

关于cocoa - 如何在 NSTabView 中设置初始 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com