Возникли проблемы с UITabBarControllers в Интерфейсном Разработчике - PullRequest
2 голосов
/ 29 марта 2010

Я создаю приложение, в котором корневое представление / окно является представлением на основе вкладок (созданным с помощью мастера XCode для создания приложения iPhone на основе вкладок), но в приложении также есть точка, в которой я хочу создать еще одно представление на основе вкладок и представить его модально.

У меня было так много проблем с созданием модального представления на основе вкладок в IB, что я в конечном итоге просто сделал это в коде, примерно так:

// *** In the event handler that causes the second-tab view to be presented ***
MyTabViewController *tabVC = [[MyTabViewController alloc] init];
[self presentModalViewController:tabVC.tabBarController animated:YES];
[tabVC release];

// *** Inside init() definition in MyTabViewController.m ***

UIViewController *vc1 = [[MyViewController1 alloc] init];
UIViewController *vc2 = [[MyViewController2 alloc] init];

tabBarController_ = [[UITabBarController alloc] initWithNibName:nil bundle:nil];
tabBarController_.viewControllers = [NSArray arrayWithObjects:vc1, vc2, nil];
tabBarController_.selectedIndex = 0;

Это работало нормально, пока я не начал пытаться писать в tabBarController_.tabBar.items, чтобы установить заголовки и изображения для кнопок, что, по-видимому, он не хочет делать для TabBar, который принадлежит TabBarController, давая эта ошибка:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Directly modifying a tab bar managed by a tab bar controller is not allowed.'

Поэтому я попытался вернуться к реализации MyTabViewController с использованием Interface Builder, чтобы я мог установить там кнопки, но я не могу понять это. Вот шаги, которые я предпринял, чтобы добраться туда, где я нахожусь:

  1. Создан новый класс, происходящий из UIViewController в XCode, и отмечен параметр «with XIB».
  2. Перетянул TabBarController в XIB (тот, за которым стоит желтый шар).

Я не могу понять, как заставить TabBar захватывать вид. Прямо сейчас представление, которое поставляется с XIB автоматически, пусто, и у меня есть этот UITabBarController, который полностью отключен от него. Если я попытаюсь перетащить TabBar из UITabBarController в View, он создаст новую TabBar вместо того, чтобы расположить TabBar в виде, чтобы он занимал весь вид.

Я прошу прощения, если я не объяснил это очень четко, но я действительно изо всех сил пытаюсь понять связь между TabBarController и View, то есть не могу понять, как заставить TabBarController фактически отображаться.

Любая помощь с этим будет высоко ценится. Я приложил скриншот из IB, если это вообще помогает.

альтернативный текст http://www.shelltoesmusic.com/files/tabbar_ib.png

1 Ответ

3 голосов
/ 29 марта 2010

Контроллер панели вкладок выбирает метки и изображения для вкладок из контроллеров представления, которыми он управляет. Метка взята из контроллеров вида 'title. Изображение получено из свойств tabBarItem контроллеров представления. Вы можете установить оба из них в методе init MyViewController1 и MyViewController2.

- (id)init {
    if (self = [super initWithNibName:@"MyViewController" bundle:nil]) {
        self.title = @"My View Controller";

        UIImage* anImage = [UIImage imageNamed:@"MyViewControllerImage.png"];
        UITabBarItem* theItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:anImage tag:0];
        self.tabBarItem = theItem;
        [theItem release];
    }
    return self;
}

Каждый контроллер представления имеет свойство view. Контроллер панели вкладок также является контроллером представления, поэтому он также имеет свойство view. Добавьте свойство контроллера панели вкладок view к представлению, которое в настоящее время пусто.

Пример:

[view addSubview:tabBarController.view];

См. документацию , если у вас есть вопросы. Это очень полно.

...