Создайте uiTabBarController программно - PullRequest
10 голосов
/ 17 ноября 2011

Я хочу создать 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/

Ответы [ 5 ]

1 голос
/ 22 апреля 2013
  1. Подкласс UITabBarController

  2. Переопределить метод - (void) loadView и включить следующий код

    MyCustomViewControllerOne* ctrl1 = [[[MyCustomViewControllerOne alloc] initWithNibName@"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]];
    

Вот и все.

1 голос
/ 17 ноября 2011

Вы говорите выше, что не хотите создавать tabBarController в appDelegate. Почему бы и нет? Где еще ты это создашь? TabBarController должен быть корневым контроллером представления и не может быть дочерним элементом любого другого контроллера представления.

Кстати, убедитесь, что вы внедрили:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {

    NSUInteger tabIndex = [tabBarController.viewControllers indexOfObject:viewController];

    if (viewController == [tabBarController.viewControllers objectAtIndex:tabIndex] ) {
         return YES;
    }

    return NO;

}
0 голосов
/ 12 января 2014

@ Мехди, просто сделайте свой TE UITabBarController вместо UIViewController, в котором затем есть TabBarController.Упрощает управление вашим TabBarController.Чтобы ответить на некоторые другие, которые указали, что вы можете иметь только один TabBarController в качестве rootViewController окна.Это не относится к делу.UITabBarController может быть создан в нескольких местах, где вам нужна навигация по меню второго уровня.Иметь TabBar внутри TabBar не имеет смысла, но иметь левое меню навигации и затем иметь TabBar для каждого пункта меню имеет смысл.

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

Изменить self.view = tabBarController.view; на
[self.view addSubview:tabBarController.view]; И работает правильно

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

Попытка изменить

self.view = tabBarController.view;

на

[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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...