Как сочетать TabBar + Navigation с XCode - PullRequest
10 голосов
/ 26 января 2009

Я пытаюсь объединить приложение TabBar + Navigation.

У меня есть 5 панелей вкладок, 4 - список вещей и детализация до подробностей.

Я пытаюсь следовать этому уроку:

http://www.iphonedevforums.com/forum/iphone-sdk-development/124-view-controller-problem.html

Но всегда получайте пустой вид.

Вот что я делаю с чистым проектом:

  • Я начинаю с шаблонного приложения TabBar.
  • Я поставил 5 кнопок панели вкладок.
  • Я создаю контроллер вроде:

    @ interface FirstViewController: UINavigationController {

    }

  • Я установил основной файл window.xib в режиме дерева и изменил выбранный первый вид на FirstViewController
  • Я выбираю контроллер TabBar в Интерфейсном конструкторе, захожу в атрибуты TabBar и изменяю класс на контроллер навигации.
  • Выберите первый вид и введите название «SecondView»

В ответ я получаю пустой экран.

Я должен добавить, что хочу переходить из представлений сведений, а не из основных окон.

Т.е. в панели вкладок главного окна 1 находится список людей. Я выбираю человека и хочу перейти к подробному окну.

Ответы [ 5 ]

15 голосов
/ 09 мая 2009

Во-первых, вы никогда не хотите создавать подклассы UINavigationController или UITabBarController.

Во-вторых, я не совсем понял, что вы сделали, но правильная последовательность создания контроллера навигации внутри контроллера панели вкладок выглядит примерно так:

// in MyAppDelegate.h
UINavigationController *nc1, *nc2;
FirstTabRootViewController *vc1;
SecondTabRootViewController *vc2;
UITabBarController *tbc;

// in MyAppDelegate.m
nc1 = [[UINavigationController alloc] init];
vc1 = [[FirstTabRootViewController alloc] initWithNibName:nil bundle:nil];
vc1.tabBarItem.title = @"Tab 1";
vc1.tabBarItem.image = [UIImage imageNamed:@"tab1.png"];
vc1.navigationItem.title = "Tab 1 Data";
nc1.viewControllers = [NSArray arrayWithObjects:vc1, nil];

nc2 = [[UINavigationController alloc] init];
vc2 = [[SecondTabRootViewController alloc] initWithNibName:nil bundle:nil];
vc2.tabBarItem.title = @"Tab 2";
vc2.tabBarItem.image = [UIImage imageNamed:@"tab2.png"];
vc2.navigationItem.title = "Tab 2 Data";
nc2.viewControllers = [NSArray arrayWithObjects:vc2, nil];

tbc = [[UITabBarController alloc] init];
tbc.viewControllers = [NSArray arrayWithObjects:nc1, nc2, nil];

Обратите внимание, что ваш контроллер представления управляет текстом / значком на панели вкладок и на панели навигации. Создайте экземпляр UINavigationController для каждой из ваших вкладок; UINavigationController содержит стек контроллеров представления (см. Свойство viewControllers), который должен содержать хотя бы один элемент - ваш корневой контроллер для этой вкладки. Также создайте UITabBarController для управления вкладками.

Конечно, вы можете (и, вероятно, должны) использовать конструктор интерфейса вместо кода для создания экземпляров упомянутых классов и установки свойств. Но важно, чтобы вы понимали, что происходит за кулисами; Конструктор интерфейсов - не более чем удобный способ создания и настройки объектов.

Надеюсь, это полезно; Пожалуйста, уточните свой вопрос, если это не так.

2 голосов
/ 04 января 2010

По-прежнему отображается пустой экран При запуске приложения после реализации вышеуказанного кода. Где я пишу это неправильно.

  nc1 = [[UINavigationController alloc] init];
  nc2 = [[UINavigationController alloc] init];
  vc1 = [[FirstRootViewController alloc]initWithNibName:@"FirstRootViewController" bundle:nil];
  vc1.tabBarItem.title = @"Item 1";
  vc1.tabBarItem.image= [UIImage imageNamed:@"home.png"];
  vc1.navigationItem.title = @"Tab1 Data";
  nc1.viewControllers = [NSArray arrayWithObjects:vc1,nil];
  vc2 = [[SecondRootViewController alloc]initWithNibName:@"SecondRootViewController" bundle:nil];
  vc2.tabBarItem.title = @"Item 2";
  vc2.tabBarItem.image= [UIImage imageNamed:@"home.png"];
  vc2.navigationItem.title = @"Tab2 Data";
  nc2.viewControllers = [NSArray arrayWithObjects:vc2,nil];
  tbc = [[UITabBarController alloc]init];
  tbc.viewControllers = [NSArray arrayWithObjects:nc1,nc2,nil];
  [window addSubview:tbc.view];
  [window makeKeyAndVisible];
1 голос
/ 07 июня 2009

Я попытался создать приложение для iphone с UITabBarController и некоторым UINavigationController внутри, и столкнулся с теми же проблемами, что и "mamcx". С вашим примером-кода я запускаю его :) Большое спасибо.

Вот как это работает для меня.

// YOURS
fourthNavigation = [[UINavigationController alloc ] init ];
fourthViewController = [[[FourthTabRootController alloc] initWithNibName:@"FourthView" bundle:nil] autorelease];
fourthNavigation.tabBarItem.title = @"YOURS";
fourthNavigation.viewControllers = [NSArray arrayWithObjects:fourthViewController, nil];

// Add self-defined UIViewControllers to the tab bar
tabBarController.viewControllers = [NSArray arrayWithObjects:firstNavigation,secondNavigation, thirdNavigation, fourthNavigation, nil];
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];

Другие контроллеры UINavigation "firstNavigation, ..." создаются таким же образом. Я загружаю элементы вида из nib-файлов, которые связаны с моими подклассовыми классами UIViewController. Вам не нужно добавлять NavigationBar в IB к вашему представлению, потому что UINavigationController уже есть один. Так что вам нужно только установить заголовок в "initWithNibName"

  // The designated initializer. Override to perform setup that is required before the view is loaded.
  - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    // Custom initialization
    self.title = @"YOURS";
}
return self;
}

Надеюсь, это поможет.

1 голос
/ 15 апреля 2009

Вот учебник , с которым я смог работать.

Я также прочитал официальную документацию SDK по теме: Объединение панели вкладок и контроллеров навигации . Поскольку я все еще учусь, учебник помог мне больше, чем документы.

ПРИМЕЧАНИЕ: в этом уроке я не думаю, что вам нужно создавать подкласс UINavigationController, и сейчас я экспериментирую с этой идеей.

0 голосов
/ 25 июля 2011

Ознакомьтесь с разделом «Добавление контроллера навигации к интерфейсу панели вкладок» в разделе Просмотр каталога контроллеров для iOS , в котором вы шаг за шагом узнаете, как именно этого можно достичь

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