Лучший подход для одного представления для вызова представления с вкладками на iPhone
РЕДАКТИРОВАТЬ Позвольте мне упростить вопрос: предположим, что ваше приложение имеет два вида: домашний вид и вид с вкладками с 3 вкладками. На главном экране есть три стандартные кнопки с именами "Tab1", "Tab2" и "Tab3". Когда вы нажимаете "Tab1", представление с вкладками должно быть открыто с выбранной вкладкой 1, и то же самое относится и к Tab2 и Tab3.
Есть намеки?
/РЕДАКТИРОВАТЬ
Что я пытаюсь сделать: когда мое приложение для iPhone инициализируется, оно отображает вид одной кнопкой. Когда я нажимаю эту кнопку, она должна перейти в представление с вкладками.
То, как я это делаю, а оно не работает (получается неперехваченное исключение): я начал с создания проекта на основе шаблона представления. На контроллере представления, который был автоматически создан, я объявил другой контроллер представления, названный TabbedViewController. Вот заголовочный файл:
#import <UIKit/UIKit.h>
@class TabbedViewController;
@interface DZBluePagesViewController : UIViewController {
TabbedViewController *tabbedViewController;
}
@property (nonatomic, retain) TabbedViewController *tabbedViewController;
-(IBAction)goToTabbedView:(id)sender;
@end
Я создал XIB под названием TabbedView
и установите идентификатор класса владельца файла для TabbedViewController. Я также перетащил контроллер панели вкладок к нему.
Я добавил кнопку на главном экране, и вот действие, которое я связал с ней в файле контроллера основного вида:
- (void)viewDidLoad {
TabbedViewController *tvc = [[TabbedViewController alloc]
initWithNibName:@"TabbedView" bundle:nil];
self.tabbedViewController = tvc;
[tvc release];
[super viewDidLoad];
}
-(IBAction)goToTabbedView:(id)sender {
// [self.view removeFromSuperview];
[self.view insertSubview:tabbedViewController.view atIndex:0];
}
Я получаю необъяснимое исключение при вызове insertSubview... Я уже выполнил 3 или 4 учебника (из книги iPhone Development - Mark and LaMarche - book) по приложениям с несколькими окнами, и я подумал, что готов сделать одно без кого-либо держась за руки... очевидно, неправильно. Кто-нибудь может помочь?
4 ответа
Чтобы ответить на ваш упрощенный вопрос
Я думаю, что вам нужен третий "корневой" вид и контроллер представления, чтобы он был супервизором как главного, так и представления панели вкладок.
Когда ваше приложение запускается, Root-представление загрузит содержимое Home-представления. Вы можете сделать это внутри корневого контроллера вида с помощью этих строк:
homeViewController.view.frame = self.view.bounds;
[self.view addSubview:homeViewController.view];
Затем, когда вы хотите переключиться на представление панели вкладок, вы должны сделать это:
[homeViewController.view removeFromSuperview];
tabBarViewController.view.frame = self.view.bounds;
[self.view addSubview:tabBarViewController.view];
Есть одна загвоздка: viewWillAppear:, viewDidAppear: методы не будут вызываться, если вы не вызовете их сами, поэтому вам придется вставлять их также в нужных местах.
Это может быть проще сделать, как предлагает Бен Готлиб, и использовать UINavigationController в качестве корневого представления. (Я имею в виду root в том смысле, в каком я его использовал, корневое представление контроллера навигации будет вашим домашним представлением.) Затем вместо приведенного выше кода вы можете просто вызвать pushViewController: метод, чтобы вставить tabBarViewController. Если вы Сделав это, вы захотите настроить UINavigationController, чтобы скрыть панель навигации, поскольку вы, вероятно, не хотите этого, и Apple фактически не рекомендует помещать панель вкладок в иерархию представления навигации.
Что касается исключения
Код, который вы разместили, похоже, не имеет ничего общего с исключением, которое вы разместили. См. Этот пост в блоге для получения инструкций по установке глобальной точки останова для сгенерированных исключений. Таким образом, вы можете использовать отладчик, чтобы выяснить, какая строка кода нарушена в вашей собственной программе.
Откройте консоль запуска (shift-command-R), когда получите исключение. Опубликовать это. Вы также можете открыть консоль и в командной строке ввести "bt" для "обратной трассировки".
Опубликуйте исключение.
Почему избыточное представление меню? Почему бы просто не иметь представление вкладок как отдельное представление и позволить пользователю выбирать, какую вкладку он хочет выбрать? Я не понимаю, зачем вам меню, которое просто открывает определенную вкладку, когда интерфейс панели вкладок делает это без меню...
Я бы предложил использовать UINavigationController, а затем нажать на него tabController, как только они выберут кнопку. Если вам не нужна анимация слайдов, просто передайте NO для аргумента animated:.