0

私はiOSアプリに取り組んでおり、そこにはタブバーコントローラーとそれぞれのビューコントローラーがあります。ビューコントローラーで設定されたタブバーコントローラーの各タブ。このセットアップは、.xib ファイル自体で行われます。それでも、didFinishLaunchingWithOptions に以下のコードを追加して、アプリの起動時にデフォルト ビューを 2 番目のタブ ビューとして起動します。

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

ここで何が起こるかというと、iOS 4 シミュレーターとデバイスでは問題なく動作しますが、iOS 5 シミュレーターとデバイスではこのコードの 2 行目でクラッシュが発生しています。iOS 5 デバイス/シミュレーターでのみクラッシュする理由を突き止めようとしていますが、結論はまだ出ていません。ビュー コントローラーが .xib ファイル自体で既にセットアップされている場合、オブジェクトをインスタンス化して、iOS5 の didFinishLaunchingWithOptions でこのようにセットアップする必要はありませんか? このクラッシュの理由は何ですか、アドバイスしてください。

ありがとうございました!

4

1 に答える 1

3

を使用する場合setSelectedViewController、コントローラはタブ バー コントローラのviewControllers配列内の 1 つでなければなりません。ただし、ここで新しいコントローラーを作成しているため、必然的に失敗します。を使用するだけ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 に答える