Создать программный интерфейс 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 для каждого элемента меню.