0

我正在开发一个 iOS 应用程序,其中我有一个标签栏控制器和相应的视图控制器。对于使用视图控制器设置的选项卡控制器中的每个选项卡。此设置在 .xib 文件本身中完成。但是,在 didFinishLaunchingWithOptions 中,我还添加了以下代码,以便在我的应用启动时将默认视图作为第二个选项卡视图启动,

self.viewController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];
[self.tabBarController setSelectedViewController:self.viewController]; // crash

这里发生的情况是,它在 iOS 4 模拟器和设备上运行良好,但崩溃发生在 iOS 5 模拟器和设备中此代码的第二行。我们试图找出为什么它只在 iOS 5 设备/模拟器上崩溃,但仍然无法得出结论。如果视图控制器已经在 .xib 文件本身中设置,那么我不需要实例化对象并在 iOS5 的 didFinishLaunchingWithOptions 中进行这样的设置?这次崩溃的原因可能是什么,请指教。

谢谢!

4

1 回答 1

3

当您使用setSelectedViewController时,控制器必须是标签栏控制器viewControllers数组中的一个。但是你在这里创建了一个新的控制器,所以它必然会失败。你应该只使用setSelectedIndex. 这是最简单的。

因此,如果您使用的是 NIB,则didFinishLaunchingWithOptions可能如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    UIViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];

    // tell the tab bar controller to start with the second tab

    [self.tabBarController setSelectedIndex:1];

    return YES;
}

如果使用故事板,并且您的初始控制器是该选项卡栏控制器,您可以:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
    [tabController setSelectedIndex:1];

    return YES;
}
于 2012-12-24T03:45:04.770 回答