2015-04-19 2 views
0

У меня есть контроллер таблеток в качестве главного экрана в моем приложении. На некоторых вкладках встроен контроллер навигации.Tab + NavigationController flow

Это моя проблема: Первая вкладка является начальной, когда приложение запускается. При определенных условиях пользователь должен увидеть второй экран B (в стеке навигации) сразу после запуска приложения (есть функция выполнения, которая запускается в viewWillAppear первого экрана). Это работает так, как должно. Пользователь запускает приложение и сразу видит второй экран. Это также работает, когда пользователь переключается на разные вкладки и обратно. Проблема в том, что пользователь уже находится на первой вкладке и снова нажимает на него. Затем стек уничтожается, пользователи видят первый экран A, который будет анимировать второй экран B в коротком порядке. Этот переход хорошо просматривается пользователем.

First tab --> screen A --> screen B --> ... 
| 
Second tab --> screen T --> screen U --> ... 
| 
... 

Вопрос в том, как предотвратить такое поведение? В этом случае пользователь не должен видеть переход между A и B.

Благодаря

ответ

0

Это ожидаемое поведение UITabBarController, оно выведет контроллер навигации на первый контроллер представления в стеке.

Если вы не хотите, чтобы экран A отображался при определенных условиях, когда пользователь вводит элемент панели вкладок, просто удалите первый контроллер представления из стека навигации, сделав что-то вроде этого после нажатия от A до B (экземпляр формы в viewDidLoad: зрения B контроллера):

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers]; 
[allViewControllers removeObjectAtIndex: 0]; 
navigationController.viewControllers = allViewControllers; 

Таким образом, экран B будет корневой контроллер представления вашего стека навигации, которая является то, что вы хотите.

+0

Хм, это не кажется очень последовательным поведением uitabbarcontroller, так как он будет только вызывать контроллер на втором касании. В любом случае, определенное условие изменится снова, поэтому я бы вернул его в качестве корневого контроллера. – Tom

+0

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

+0

Вы правы. В конце концов это было решение, которое я использовал. Когда условие меняет, я ставлю A обратно корнем, и он действительно работает довольно хорошо ... Спасибо – Tom

1

Почему вы не изменить код с экрана на выполнение проектно SEGUE к следующему следующему экрану B UNSER НЕКОТОРЫХ состояние.,

Просто используйте этот CERTAINcondition в TabbarController классе (подклассе TabBar) в метод, как,

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 
{ 
    if (tabBarController.selectedIndex == 0) 
    { 
     if (CERTAIN condition True) { 
       UITabBar tabbar = self.tabBarController.tabBar; 
       NSArray *controlrs = self.viewControllers; 
       NSMutableArray *controllerCopy = [controlrs mutablecopy]; 
       SCREEN_B_class *bClassObj = . .. //Tab 1 class Just Screen B, not Screen A -> ScreenB 
       [controllerCopy replaceObjectsAtIndex:[NSIndexSet indexSetWithIndex:0] withObjects:[NSArray arrayWithObjects:bClassObj]] 
       tabBarController.viewControllers = controllerCopy; 

     } 

    } 
} 

Надеется, что это помогает вам,

НТНА, Enjoy Coding !!

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