Лучший подход для одного представления для вызова представления с вкладками на 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:.

Другие вопросы по тегам