TabBatController с viewControllers - PullRequest
       44

TabBatController с viewControllers

0 голосов
/ 18 сентября 2011

В моем приложении на основе tabBarController у меня есть четыре вкладки - tabA, tabB, tabC и tabD. Пользователь сможет переходить между вкладками.

Теперь на мой вопрос:
- tabA, tabB и tabD имеют отдельные контроллеры view
- хотя tabC имеет 3 viewControllers - vc1, vc2 и vc3

Я столкнулся с проблемой, когда приложение запоминает, какой viewController был последним в пользователе, и когда пользователь нажимает tabC, элемент управления переходит к последнему контроллеру представления, в котором был пользователь. Например, скажем, следующее последовательность:

  1. Пользователь нажимает вкладку A: отображается контроллер представления для tabA
  2. Пользователь нажимает tabD: отображается контроллер представления для tabD
  3. Пользователь нажимает вкладку C: отображается контроллер vc1. При нажатии на какое-либо действие пользователь попадает на vc3
  4. Пользователь нажимает tabB: отображается контроллер представления для tabB
  5. Пользователь нажимает вкладку C: отображается vc3 - вместо этого я хотел бы показать vc1

До сих пор я пробовал следующее в vc1 tabC, но управление vc1 вообще не приходит:

- (void) viewWillAppear:(BOOL)animated {
      [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
}

Как мне сказать tabC всегда загружать vc1?

С уважением - заранее спасибо ....
Сэм.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

@ дворак: Спасибо за ответ - и извините за то, что тянулись ...

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

Мне не повезло с предложением. Я сделал AppDelegate TabBarControllerDelegate. Функция обратного вызова вызывается - однако, используя следующий код, я не могу popToRootViewController:

- (void)tabBarController:(UITabBarController *)tbController didSelectViewController:(UIViewController *)viewController {
       NSLog(@"ViewController is <%@>", viewController.tabBarItem.title);
       if ([viewController.tabBarItem.title isEqualToString:@"tabC"]) {
           NSArray *tmp = [viewController.navigationController.tabBarController viewControllers];
          [viewController.navigationController popToRootViewControllerAnimated:YES];
       }
}

Я собрал все ViewControllers в переменную tmp , в надежде увидеть 3 ViewController в массиве после посещения всех трех VC tabC. В tabC-> vc3 я нажимаю tabB, а затем нажимаю tabC для моего упражнения. Массив tmp содержал ноль элементов в отладчике.

0 голосов
/ 18 сентября 2011

Ваш вызов на vc1 tabC, скорее всего, не вызывается - viewWillAppear: вызывается только тогда, когда на дисплее появится представление.

Возможно, вы захотите взглянуть на эту функцию:

- (void)tabBarController:(UITabBarController *)tabBarController 
   didSelectViewController:(UIViewController *)viewController

( Ссылка на документы для разработчиков Apple )

и эта функция:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

( Ссылка на документы для разработчиков Apple )

Если вы реализуете это в своем делегате tabBarController, вы можете действовать, когда пользователь выбирает tabC, то есть:

- (void)tabBarController:(UITabBarController *)tabBarController 
   didSelectViewController:(UIViewController *)viewController
{
    if (viewController == \* tabC view controller */) {
        [tabCViewController.navigationController popToRootViewController:YES];
    }
}
...