UITabbarcontroller в IOS5 выбрасывает исключение UIViewControllerHierarchyInconsistency

У меня есть следующий код для 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>'

Ответы

Ответ 1

заменить:

self.view = tabBarController.view;

с:

[self.view addSubview:tabBarController.view];

Это также будет обратно совместимо с IOS3 & 4.

Ответ 2

В моем коде был одинаковый шаблон (и проблема). Решение Джо не помогло мне. Глядя на фрагмент, я предполагаю, что вы получите класс из UIViewController, чтобы вы могли настроить что-то.

То, что нужно сделать здесь, и это довольно просто, состоит в том, чтобы выводить из UITabBarController, а не UIViewController, не создавать tabBarController, и везде, где вы ссылаетесь на tabBarController, замените self.

5 минут, и вы больше не выбрасываете исключение несоответствия, и вы останетесь обратно совместимым с iOS 4. Вы все равно можете выполнить всю свою настройку в производном классе (обезьяна с контроллером nav и т.д.).

Если вы создали сложный вывод UIViewController, который вам нужно использовать, это может быть больше.

Одна небольшая ошибка - если вы переопределите LoadView, вы обнаружите, что она вызывается во время инициализации для UITabBarController. Сложно устанавливать элементы до LoadView, поэтому вам может понадобиться разделить вашу инициализацию.

Удачи!

Ответ 3

Вы не можете нажать или показать UITabbarViewController. Является ли ваш контроллер первого вида UITabBarController?

Ответ 4

Я боролся с той же проблемой.

При создании нового приложения Master-Detail (без доски объявлений) вы можете видеть эти коды ниже с 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 раза.