Подтвердить что ты не робот

Закройте панель вкладок перед переходом на другой диспетчер представлений

Я создаю приложение iOS, где у меня панель вкладок + боковое меню.

Панель вкладок имеет 5 элементов, а в боковом меню - около 12 меню.

Все функциональные возможности бокового меню находятся на вкладке 1, а боковое меню доступно для всех видов в панели вкладок.

Это означает, что если я нахожусь на вкладке 2, даже я могу получить доступ к боковому меню. Когда я нажимаю на элемент бокового меню из вкладки 1, я перехожу на вкладку 1, а затем навигация будет происходить.

Что я хочу сделать, скажем, если я нажму на меню "Жалобы" из бокового меню, я хочу перейти в "ComplainsViewController".

Код, который я использовал, приведен ниже.

// go to first tab
self.tabBarController.selectedIndex = 0;
// now navigate
ComplainsViewController *sViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"Complains"];
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:sViewCon animated:NO];

У меня есть два сценария.

Сценарий 1 (правильный)

Я нахожусь на вкладке 1 и нажимаю "Жалобы" из бокового меню. Когда я нажимаю, я успешно перехожу к ComplainsViewController, используя вышеприведенный код.

Сценарий 2 (In-Correct)

Я нахожусь на вкладке 2 и нажимаю "Жалобы" из бокового меню. Когда я нажимаю, я успешно перехожу на вкладку 1, но я не перехожу к ComplainsViewController. Когда я нажимаю обратно на вкладку 2, я вижу, что в Tab 2 открыта функция ComplainsViewController.

Любая идея, как сначала переключиться на вкладку, а затем перейти к другому диспетчеру просмотра?


Изменить 1

Ниже приведена базовая структура.

введите описание изображения здесь

4b9b3361

Ответ 1

Наконец, мне удалось решить проблему другим способом с помощью NSNotificationCenter

Ниже я это сделал.

Шаг 1 (в SideMenuViewController)

// let first go to first index
self.tabBarController.selectedIndex = 0; 
// now post notification and make transition
[[NSNotificationCenter defaultCenter] postNotificationName:@"TakeMeToComplains" object:nil];

Шаг 1 изменит значение selectedIndex и опубликует уведомление.

Шаг 2 (во всех других диспетчерах отображения)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(globalTakeMeToComplains) name:@"TakeMeToComplains" object:nil];

 -(void)globalTakeMeToComplains {
      // here I have code for Transition to go to ComplainsViewController
 }

В шаге 2, когда мы переключаемся на первую панель вкладок, viewWillAppear вызывается, где я слушаю уведомление. Как только я услышу уведомление, я выполним переход к другому контроллеру представления.

Дайте мне знать, если кто-то не знает, что я делаю.

Ответ 2

Похоже, вы забыли переключить navigationController после переключения вкладок. Попробуйте реализовать метод UITabBarControllerDelegate:

- (void)tabBarController:(UITabBarController * _Nonnull)tabBarController
 didSelectViewController:(UIViewController * _Nonnull)viewController {
    self.currentNavigationController = (UINavigationController *)viewController;
}

Затем, когда вы вручную переключаете вкладки, используйте этот код:

// go to first tab
self.tabBarController.selectedIndex = 0;

// Manually call delegate method
[self tabBarController:self.tabBarController didSelectViewController:self.tabBarController.selectedViewController];

// now navigate
ComplainsViewController *sViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"Complains"];
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[self.currentNavigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.currentNavigationController pushViewController:sViewCon animated:NO];

Для этой цели вам понадобится создать новое свойство для хранения currentNavigationController.