Переместить TabBarController в представление

Как я могу нажать TabBarController на представление?

Приложение основано на представлениях. В приложении у меня есть XIB с TabBarController, и я хочу вывести TabBar на дисплей. Я сделал все, и теперь я не знаю, что я делаю неправильно.

Вот код, который должен нажать TabBarController:

- (void)showTabBar {
TabBar *tbc = [[TabBar alloc] initWithNibName:@"TabBar" bundle:nil];
[self presentModalViewController:tbc animated:YES];
[tbc release];
}

В данный момент в XIB пустое представление. Поэтому дисплей белый, когда я запускаю этот код. Также есть TabBarController, который я хочу видеть на дисплее.

Спасибо за вашу помощь.


ОБНОВЛЕНИЕ:

Я должен сказать, что это два разных класса. Класс, на котором основана функция «showTabBar», должен нажать TabBarController. Второй класс — TabBar. TabBar является делегатом TabBarController.

Итак, я изменил ответ следующим образом, но я пробовал оба:

[self presentModalViewController:tbc.tabBarController.view animated:YES];

Теперь ошибка выглядит так:

Incompatible Objective-C types 'struct UIView *', expected 'struct UIViewController *' when passing argument 1 of 'presentModalViewController:animated:' from distinct Objective-C type

ОБНОВЛЕНИЕ:

Привет, ошибка ушла. Прохладный. ;)

Но приложение закрывается. Я видел это поведение раньше, но я не знал, что делать. Консоль отладчика говорит следующее:

2011-01-27 15:49:32.629 Touch[3657:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target <StartUp: 0x9300f20>.'

person teawithfruit    schedule 27.01.2011    source источник


Ответы (1)


Поскольку класс UITabBarController наследуется от класса UIViewController, контроллеры панели вкладок имеют собственное представление, доступное через свойство представления. При развертывании интерфейса панели вкладок вы должны установить это представление в корне вашего окна. В отличие от других контроллеров представления, интерфейс панели вкладок никогда не должен устанавливаться как дочерний элемент другого контроллера представления.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html

Это означает, что это не «разрешено», и Apple может или может в будущем отклонить ваше приложение. UITabBarController предназначен для добавления в корневое представление (окно) вашего делегата приложения. Если вы хотите, чтобы вкладка была нажата позже, вам нужно использовать UIToolBar, например. uisegmentedcontrol или кнопки панели инструментов.

Несмотря на то, что некоторые приложения делают это (например, приложение Wordpress), позже вы обнаружите, что столкнетесь с некоторыми проблемами в консоли при модальном представлении контроллеров представления (будет выдано предупреждение).

person LuckyLuke    schedule 27.01.2011
comment
Хорошо, значит ли это, что мне нужно построить TabBar самостоятельно без TabBarController? - person teawithfruit; 27.01.2011
comment
Насколько я знаю, да. Я сделал ту же ошибку с одним приложением, которое я сделал, потому что компилятор не скажет вам, что нажатие UITabBarController является неправильным, поэтому я думал, что это нормально, пока не получил помощь и не прочитал документацию (это привело к другим проблемам из-за неявного iOS устанавливает для вас отношения с parentViewController, tabBarController, navigationController). Что я сделал, так это сделал UIToolBar и добавил UISegmentedControl, который я центрировал. Однако я мог бы также использовать UIToolBarItem, который даст вам почти такой же эффект. Однако логика выталкивания/выталкивания представлений теряется. - person LuckyLuke; 27.01.2011
comment
Будете ли вы использовать обычное представление, чтобы заполнить его всем материалом TabBar, необходимым для создания TabBar? - person teawithfruit; 27.01.2011
comment
Да, вы бы создали новый контроллер представления, наследующий от UIViewController, и добавили бы компоненты в это представление. - person LuckyLuke; 27.01.2011
comment
Это так со всеми типами контроллеров? Возможно, с NavigationController или ViewController? Должен ли я создавать их все с нуля, если я хочу их использовать? - person teawithfruit; 28.01.2011
comment
Нет, вам не нужно создавать собственный UINavigationController, его можно использовать везде. Просто помните (насколько я знаю, я могу ошибаться)... UITabBar может содержать UINavigationControllers, но UINavigationController не может содержать UITabBarController, так как он должен быть установлен как root. - person LuckyLuke; 28.01.2011