Закройте панель вкладок перед переходом на другой диспетчер представлений
Я создаю приложение 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
Ниже приведена базовая структура.
![введите описание изображения здесь]()
Ответы
Ответ 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
.