Эй все, я плохо знаком с разработкой iPhone, и я не понимаю целой идеи UINavigationController и UITabBarController. Каждый - замена другого - как делают приложения, такие как Tweetie комбинируют обоих?
Я хотел бы иметь свое приложение, имеют персистентную Панель вкладок нижняя часть (который, кажется, работает), но также и Панель навигации наверху, которая может продвинуть/вытолкать представления на экран, не удаляя панель вкладок.
Большое спасибо,
Просто оберните контроллер представления внутри 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;
Воспользуйтесь мастером для приложения "Панель вкладок" и настройте его как обычно. На любой вкладке, где вы хотите добавить навигационный контроллер, создайте его в 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.
В любом случае, дайте мне знать, если более подробная информация поможет.