15

UITabbarcontroller の次のコードがあります。

NSMutableArray *arr = [[NSMutableArray alloc] init];
tabBarController = [[UITabBarController alloc] init];

FirstViewController *firstview = [[FirstViewController alloc] init];
[tabBarControllerViews addObject:firstview];
[firstview release];

 SecondViewController *secondview = [[SecondViewController alloc] init];
[tabBarControllerViews addObject:secondview];
[secondview release];

[tabBarController setViewControllers:arr animated:YES];
[arr release];

self.view = tabBarController.view;

このコードは IOS4 で問題なく動作します。IOS5 ベータ版で試してみたところ、UITabbarItem をタップすると次のエラーが発生しました。

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency',
reason: 'child view controller:<FirstViewController: 0x6e03be0> should have parent view
controller:<MainViewController: 0x6816d20> but actual parent is:<UITabBarController: 0x6b0c110>'
4

4 に答える 4

23

交換:

self.view = tabBarController.view;

と:

[self.view addSubview:tabBarController.view];

これは、IOS3&4との下位互換性もあります。

于 2011-09-20T01:08:12.327 に答える
6

私のコードにも同じパターン(および問題)がありました。ジョーの解決策は私にはうまくいきませんでした。スニペットを見ると、UIViewControllerからクラスを派生させて、何かをカスタマイズできるようになっていると思います。

ここで行うことは、非常に簡単ですが、UIViewControllerではなくUITabBarControllerから派生し、tabBarControllerを作成せず、tabBarControllerを参照する場所でselfを置き換えます。

5分で、不整合の例外がスローされなくなり、iOS 4との下位互換性が維持されます。派生クラスですべてのカスタマイズを行うことができます(navコントローラーを使用したモンキー処理など)。

使用する必要のあるUIViewControllerの複雑な派生を構築した場合、これはより多くの作業になる可能性があります。

1つの小さな落とし穴-LoadViewをオーバーライドすると、UITabBarControllerの初期化中に呼び出されることがわかります。LoadViewの前にメンバーを設定するのが難しくなるため、初期化を分割する必要がある場合があります。

幸運を!

于 2011-10-07T08:17:29.653 に答える
0

UITabbarViewController をプッシュまたは提示することはできません。最初のView Controllerは UITabBarController ですか?

于 2011-09-20T00:53:49.050 に答える
0

私は同じ問題に苦労しました。

新しいマスター/ディテール アプリケーション (ストーリー ボードなし) を作成すると、AppDelegate.m から以下のコードを確認できます。

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

「MainWindowに依存しないでください」独自のViewControllerから開始し、デリゲートに設定するだけです。MainWindow.xib からビューのリンクを解除することを忘れないでください。そうしないと、ビューが 2 回呼び出されます。

于 2011-10-17T06:03:43.683 に答える