Ответ 1
заменить:
self.view = tabBarController.view;
с:
[self.view addSubview:tabBarController.view];
Это также будет обратно совместимо с IOS3 & 4.
У меня есть следующий код для 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>'
заменить:
self.view = tabBarController.view;
с:
[self.view addSubview:tabBarController.view];
Это также будет обратно совместимо с IOS3 & 4.
В моем коде был одинаковый шаблон (и проблема). Решение Джо не помогло мне. Глядя на фрагмент, я предполагаю, что вы получите класс из UIViewController, чтобы вы могли настроить что-то.
То, что нужно сделать здесь, и это довольно просто, состоит в том, чтобы выводить из UITabBarController, а не UIViewController, не создавать tabBarController, и везде, где вы ссылаетесь на tabBarController, замените self.
5 минут, и вы больше не выбрасываете исключение несоответствия, и вы останетесь обратно совместимым с iOS 4. Вы все равно можете выполнить всю свою настройку в производном классе (обезьяна с контроллером nav и т.д.).
Если вы создали сложный вывод UIViewController, который вам нужно использовать, это может быть больше.
Одна небольшая ошибка - если вы переопределите LoadView, вы обнаружите, что она вызывается во время инициализации для UITabBarController. Сложно устанавливать элементы до LoadView, поэтому вам может понадобиться разделить вашу инициализацию.
Удачи!
Вы не можете нажать или показать UITabbarViewController. Является ли ваш контроллер первого вида UITabBarController?
Я боролся с той же проблемой.
При создании нового приложения 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 раза.