UITabbarcontroller в IOS5 выдает исключение UIViewControllerHierarchyInconsistency - PullRequest
15 голосов
/ 08 июня 2011

У меня есть следующий код для контроллера UITabbar:

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 ]

23 голосов
/ 20 сентября 2011

заменить:

self.view = tabBarController.view;

на:

[self.view addSubview:tabBarController.view];

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

6 голосов
/ 07 октября 2011

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

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

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

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

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

Удачи!

0 голосов
/ 17 октября 2011

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

Когда вы создаете новое приложение 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];

«НЕ ЗАВИСИТЕ ОТ МЕНЮ» Просто начните с вашего собственного ViewController и установите его на делегирование. И не забудьте отсоединить представление от MainWindow.xib, иначе оно будет вызвано 2 раза.

0 голосов
/ 20 сентября 2011

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

...