Наличие UITabBar И UINavigationController в приложении?

Эй все, я плохо знаком с разработкой iPhone, и я не понимаю целой идеи UINavigationController и UITabBarController. Каждый - замена другого - как делают приложения, такие как Tweetie комбинируют обоих?

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

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

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

7
задан barfoon 26 February 2010 в 02:39
поделиться

2 ответа

Просто оберните контроллер представления внутри 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;
15
ответ дан 6 December 2019 в 10:49
поделиться

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

В любом случае, дайте мне знать, если более подробная информация поможет.

3
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: