2010-01-02 9 views
1

EDIT Позвольте мне упростить вопрос: Предположим, что ваше приложение имеет две точки зрения, вид на дом и вкладками вид с 3-мя вкладками. В домашнем представлении есть три стандартные кнопки с названием «Tab1», «Tab2» и «Tab3». Когда вы нажимаете на «Tab1», вид с вкладками должен быть открыт с выбранным вкладом 1, а - для Tab2 и Tab3.Лучший подход для одного взгляда, чтобы вызвать вкладками взгляд на iPhone

Любые подсказки?
/EDIT

То, что я пытаюсь сделать: когда мой 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 и LaMarche - book) в многопользовательских приложениях до сих пор, и я думал, что готов сделать это без того, чтобы кто-то держал меня за руки ... очевидно, неправильно. Кто-нибудь может помочь?

+0

Проблема в TabbedViewController, можете ли вы предоставить дополнительную информацию об ошибке, получать? – bentford

+0

Вот паста с консоли отладчика 2010-01-02 11: 02: 00.869 DZBluePages [5604: 207] *** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Непосредственная модификация панели вкладок, управляемой контроллер панели вкладок не разрешен. ' 2010-01-02 11: 02: 00,871 DZBluePages [5604: 207] Stack: ( 29262939, 2525458249, ... –

ответ

1

Чтобы ответить на ваш вопрос упрощенного

Я думаю, что вам нужен третий «корень» и вид контроллер быть SuperView обоихов зрения дома, а затем представления Tab Bar.

Когда ваше приложение запустится, представление Root загрузит содержимое Домашнего вида. Вы можете сделать это внутри контроллера зрения корень с этими линиями:

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 в качестве корневого представления. (Я имею в виду корень как смысл, который я использовал, корневой вид контроллера навигационного устройства будет вашим домашним представлением.) Затем вместо кода выше вы можете просто вызвать метод pushViewController: для перемещения вкладки tabBarViewController. Если вы сделаете это, вы захотите настроить UINavigationController, чтобы скрыть панель навигации, поскольку вы, вероятно, этого не хотите, и Apple на самом деле не рекомендует помещать панель вкладок внутри иерархии отображения навигации.

Что касается исключения

код вы вывесили, кажется, не имеют ничего общего, за исключением вас в курсе. See this blog post for instructions on setting a global breakpoint on thrown exceptions. Таким образом, вы можете использовать отладчик, чтобы выяснить, что является нарушением строки кода в вашей собственной программе.

+0

Спасибо.! Я попробую это, но сначала я хочу собрать дополнительную информацию об исключении, используя советы по вашей ссылке. –

0

Откройте консоль запуска (shift-command-R), когда вы получите исключение. Отправьте это. Вы также можете открыть консоль и в командной строке введите «bt» для «back trace».

Опубликовать исключение.

+0

попытаться идти в интерфейс строитель, удаление TabView, а затем добавить новый – justin

0

Я бы предложил использовать UINavigationController, а затем нажать на свой tabController, как только они выберут кнопку. Если вы не хотите анимацию слайдов, просто передайте NO для анимированного аргумента.

0

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

+0

Домашний вид имеет дополнительную функциональность, я не упомянул об этом ради простоты. –