Иметь UITabBar И UINavigationController в приложении? - PullRequest
7 голосов
/ 26 февраля 2010

Привет всем, я новичок в разработке для iPhone, и я не понимаю всей идеи UINavigationController и UITabBarController. Является ли одно заменой другого - как приложения, такие как Tweetie, объединяют оба?

Мне бы хотелось, чтобы у моего приложения была постоянная панель вкладок @ внизу (которая, кажется, работает), а также панель навигации вверху, которая может выдвигать / выдвигать представления на экран без удаления панели вкладок.

  • Как мне это сделать?
  • Как должна выглядеть иерархия в IB относительно моего MainWindow.xib относительно всех этих контроллеров?
  • Какая лучшая практика здесь?

Большое спасибо,

Ответы [ 2 ]

15 голосов
/ 26 февраля 2010

Просто оберните контроллер вида внутри UINavigationController и поместите UINavigationController внутрь UITabBar. Это будет хорошо работать для вас ...

Пример:

NSMutableArray *tabBarViewControllers = [[NSMutableArray alloc] initWithCapacity:2];

tabBarController = [[UITabBarController alloc] init];
[tabBarController setDelegate:self];

UINavigationController *navigationController = nil;
navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller1>];
[tabBarViewControllers addObject:navigationController];
[navigationController release];
navigationController = nil;

navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller2>];
[tabBarViewControllers addObject:navigationController];
[navigationController release];
navigationController = nil;

tabBarController = tabBarViewControllers;
[tabBarViewControllers release];
tabBarViewControllers = nil;
3 голосов
/ 26 февраля 2010

Используйте мастер для приложения панели вкладок и настройте его как обычно. На любой вкладке, где вы хотите добавить контроллер навигации, создайте его в XIB с помощью библиотеки. Мой XIB имеет:

- File's Owner          DescriptiveNameNavViewController
- First Responder
- View                  UIVIew
- Navigation Controller UINavigationController
  - Navigation Bar      UINavigationBar

Обратите внимание, что в представлении нет ничего. См. ViewDidLoad ниже, где UINavigationController присоединяется к UIView.

В заголовочном файле для ViewController вкладки (который я здесь назвал DescriptiveNameNavViewController - для этого нет определенного стандарта, но я использую [Something] NavViewController, чтобы напомнить мне, что этот ViewController содержит контроллер навигации с стек навигации. Это имя контроллера, которое я установил в MainWindow.xib, который генерирует мастер.) Установите UINavigationController * IBOutlet, к которому подключен контроллер навигации в XIB:

@interface DescriptiveNameNavViewController : UIViewController {
    UINavigationController *navigationController;
}
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

В контроллере для DescriptiveNameNavViewController сделайте что-то вроде этого:

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self view] addSubview:[navigationController view]];
    DescriptiveNameController *aController = [[[DescriptiveNameController alloc ] initWithNibName:@"DescriptiveNameController" bundle:nil ] autorelease];
    aController.title = @"Descriptive Title";

//
//  app stuff goes here.
//

    [self.navigationController pushViewController:aController animated:YES];
    [self.navigationController setDelegate:self];
}

Установка делегата в DescriptiveNameNavViewController очень важна, потому что в противном случае вы не получите методы, которые вы ожидаете, ожидаемые в экземплярах DescriptiveNameViewController и все остальное, что вы помещаете в стек контроллера навигации.

В DescriptiveNameNavViewController реализуйте методы UINavigationControllerDelegate, например:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([viewController respondsToSelector:@selector(viewDidAppear:)]) {
        [viewController viewDidAppear:animated];
    }
}

И это приведет к тому, что сообщения будут передаваться на контроллеры внутри UINavigationController, как вы ожидаете. Кажется, что многие проблемы, с которыми сталкиваются люди, заключаются в том, что viewDidAppear: или другие методы не вызываются для ViewControllers, помещенных в NavigationController.

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

...