Как объединить 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 Controller в построителе интерфейсов, перехожу в TabBar Attributes и меняю класс на контроллер навигации.
  • Выберите первый вид и введите имя пера "SecondView".

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

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

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


person mamcx    schedule 25.01.2009    source источник


Ответы (5)


Во-первых, вы никогда не захотите создавать подклассы 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 для управления вкладками.

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

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

person Andrey Tarantsov    schedule 09.05.2009
comment
Здорово! Спасибо, Андрей, очень помогло! - person Darmen Amanbayev; 29.08.2011
comment
это очень помогло, спасибо. Я искал хороший контроллер панели вкладок, созданный программно. - person Jake; 24.02.2012

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

  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];
person success_anil    schedule 04.01.2010

Вот руководство, которое мне удалось чтобы приступить к работе.

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

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

person bentford    schedule 15.04.2009
comment
Мне потребовалось немного осмотреться, но учебник, на который вы ссылались, был / перемещен. Сейчас он находится по адресу: это место - person Critter; 26.05.2011

Я попытался создать приложение для 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];

Остальные UINavigationControllers «firstNavigation, ...» создаются таким же образом. Я загружаю элементы представления из файлов пера, которые связаны с моими подклассами 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;
}

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

person user118814    schedule 07.06.2009

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

person bhavinb    schedule 25.07.2011