Как объединить TabBar + Navigation с XCode

Я собираюсь объединить приложение 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 находится список людей. Я выбираю человека, затем хочу перейти к подробному окну.

Ответ 1

Во-первых, вы никогда не хотите подклассифицировать 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

Проверьте этот отличный видео-учебник

Создание приложения iPhone, объединяющего панель вкладок, навигацию и вкладку

http://www.youtube.com/watch?v=LBnPfAtswgw

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

Ответ 3

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

  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];

Ответ 4

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

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

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

Ответ 5

Я попытался создать приложение 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 current view as a subview of the window
[window addSubview:tabBarController.view];

Другие UINavigationControllers "firstNavigation,..." создаются одинаково. Я загружаю элементы представления из nib файлов, которые связаны с моими подклассами классов UIViewController. Вам не нужно добавлять NavigationBar в IB к вашему представлению, потому что UINavigationController имеет allready один. Поэтому вам нужно только установить заголовок в "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;
}

Я надеюсь, что это поможет.