2011-01-20 8 views
28

У меня есть базовый проект, созданный в xcode в качестве приложения «Tab Bar Application». Я бы хотел, чтобы приложение было загружено на вторую вкладку, если BOOL x истинно.Программно меняя выбранную вкладку tabBarController

Сейчас я: (нахожусь в FirstViewController.m в viewDidLoad)

if(x){ 
    [self.tabBarController setSelectedIndex:1]; 
} 

Это приводит к тому, выбранной вкладке в нижней части страницы, чтобы выделить вкладку 2-й, однако мнение остается факт, что из первых вкладка.

Как мне изменить вид на вторую вкладку?

+1

То, что вы правильно на уровне поверхности. Я подозреваю что-то странное в том, как настроен ваш контроллер панели вкладок. Если вам нужно было зарегистрировать свойство viewControllers вашего контроллера панели вкладок, вы видите различные контроллеры представлений? –

+0

Да, если я регистрирую viewControllers, я возвращаю массив из 3 контроллеров в моем проекте. –

+1

Хорошо, тогда, если вы зарегистрируете свойство selectedViewController вашего контроллера панели вкладок до и после вызова -setSelectedIndex :, являются ли контроллеры то, что вы ожидаете от них, или оно остается неизменным? –

ответ

46

Ну, я воспроизвел свой вопрос, и решить ее путем перемещения логики переключения из -viewDidLoad в -viewDidAppear :. Поэтому в основном, изменение:

- (void)viewDidLoad { 
    // Other code... 
    if(x){ 
     [self.tabBarController setSelectedIndex:1]; 
    } 
} 

к:

- (void)viewDidAppear:(BOOL)animated { 
    // Other code... 
    if(x){ 
     [self.tabBarController setSelectedIndex:1]; 
    } 
} 

Теперь, как и почему это так, я могу только догадываться, без дополнительного копания, что он должен делать с порядком вещей инициализируется. Возможно, что viewDidLoad диспетчера вашего вида вызывается до того, как контроллер родительской панели вкладок завершил свою собственную инициализацию. Удерживаясь, пока ваше представление не появилось, вы убедитесь, что все загружено и находится в постоянном состоянии.

+0

Ах работает лучше, чем мое решение. Спасибо –

+0

Это не работает для меня. Я не знаю, почему .. Я поместил тот же код [self.tabBarController setSelectedIndex: 1]; в функции, которая выполняется при нажатии кнопки. У вас есть идеи? – acecapades

+0

@acecapades, вы говорите, что код _doesn't_ работает, когда он помещен в обработчик кнопки? –

3
[self.tabBarController setSelectedIndex:1] 
[window addSubview:[tabBarController view]]; 
[window makeKeyAndVisible]; 
+0

Я получаю окно необъявленным, если я переключу его на self.window он с ошибкой «Запрос для членского окна» в чем-то не struct или union » –

+1

Этот код предназначен для запуска из приложения-приложения приложенияDidFinishLaunching: , Он не будет работать, как есть, из реализации контроллера вашего представления. –

+0

Это моя проблема, это нужно запускать с контроллера вида. Я упростил проблему выше, но я не знаю погоды или нет, мне нужно отправить их на вкладку, пока не будет сделана некоторая загрузка на этом конкретном представлении. –

4

Это было бы достаточно:

[tabBar setSelectedIndex:0];

9

Предполагая, что вы работаете с контроллером, который является подклассом UITabBarController, вам нужно всего лишь установить свойство SelectedIndex.

Например:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.selectedIndex = 1; 
} 

Я предпочитаю делать это задание в методе viewDidLoad так что вы можете быть гарантировано, что отображается только контроллер представления в выбранном индексе. Если вы используете функцию viewDidAppear, вы увидите, что контроллер вида с индексом 0 отображается кратковременно, когда представление панели вкладок загружается до отображения индекса 1.

+0

Я пробовал много вещей. Этот был единственным, кто работал, спасибо –

Смежные вопросы