Создать программный интерфейс uiTabBarController
Я хочу создать UIView
для UITabBarController
Вот мой код для файла .h
:
@interface TE : UIViewController <UITabBarControllerDelegate>{
UITabBarController *tabBarController;
}
@property (nonatomic,retain) UITabBarController *tabBarController;
@end
Метод viewDidLoad
:
UIViewController *testVC = [[T1 alloc] init];
UIViewController *otherVC = [[T2 alloc] init];
NSMutableArray *topLevelControllers = [[NSMutableArray alloc] init];
[topLevelControllers addObject: testVC];
[topLevelControllers addObject: otherVC];
tabBarController = [[UITabBarController alloc] init];
tabBarController.delegate = self;
[tabBarController setViewControllers:topLevelControllers animated:NO];
tabBarController.selectedIndex = 0;
self.view = tabBarController.view;
Это создает контроллер панели вкладок, но когда я нажимаю на элемент панели вкладок, я получаю сообщение об ошибке:
Thread1: Сигнал приема программы: SIGABRT
Изменить. Я решил проблему, загрузив и изменив версию http://www.iphonedevcentral.com/create-uitabbarcontroller/
Ответы
Ответ 1
Вы говорите выше, что не хотите создавать tabBarController в appDelegate. Почему нет? Где еще вы его создадите? TabBarController должен быть контроллером корневого представления и не может быть дочерним элементом любого другого контроллера представления.
Btw, убедитесь, что вы реализуете:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
NSUInteger tabIndex = [tabBarController.viewControllers indexOfObject:viewController];
if (viewController == [tabBarController.viewControllers objectAtIndex:tabIndex] ) {
return YES;
}
return NO;
}
Ответ 2
-
Подкласс UITabBarController
-
Переопределите метод loadView (void) и включите следующий код
MyCustomViewControllerOne* ctrl1 = [[[MyCustomViewControllerOne alloc] [email protected]"MyViewControllerOne" bundle: nil] autorelease];
UIViewController* ctrl2 = [[[UIViewController alloc] init] autorelease];
MyCustomControllerTwo* ctrl3 = [[[UIViewController alloc] initWithObject: myObj] autorelease];
ctrl1.title = @"First tab";
ctrl2.title = @"Second tab";
ctrl3.title = @"Third tab";
ctrl1.tabBarItem.image = [UIImage imageNamed:@"tab_image1.png"];
ctrl2.tabBarItem.image = [UIImage imageNamed:@"tab_image2.png"];
ctrl3.tabBarItem.image = [UIImage imageNamed:@"tab_image3.png"];
[self setViewControllers: @[ctrl1, ctrl2, ctrl3]];
Это в значительной степени.
Ответ 3
Попытка изменения
self.view = tabBarController.view;
to
[self.view addSubview:tabBarController.view];
Посмотрите, поможет ли это.
Также попробуйте поместить это в свой -(void)loadView
метод
- (void)loadView {
UIView *mv = [[UIView alloc] initWithFrame:CGRectMake(0.0, 100.0, 320.0, 480.0)];
self.view = mv;
[mv release];
}
Причина, по которой вы, вероятно, испытываете черный экран, состоит в том, что вы не инициализировали свой UIView должным образом.
Ответ 4
Измените self.view = tabBarController.view;
на
[self.view addSubview:tabBarController.view];
И он работает правильно
Ответ 5
@Mehdi, просто сделайте свой TE UITabBarController вместо UIViewController, в котором затем есть TabBarController. Делает все более простым управление вашим TabBarController. Чтобы ответить на некоторые другие, которые указали, что вы можете иметь только один TabBarController в качестве окна rootViewController. Это не относится к делу. UITabBarController может быть создан в нескольких местах, где вам нужна навигационная система второго уровня. У TabBar в TabBar не будет смысла, но иметь левое меню навигации, а затем иметь TabBar для каждого элемента меню.