Спрячьте TabBar при вводе в стек навигации и верните его, когда выскочили из стека навигации
Я пытаюсь сделать следующее.
У меня есть контроллер панели вкладок с двумя вкладками. Обе вкладки представляют собой контроллер навигации с табличным представлением для каждого из них.
Теперь, когда я выбираю одну ячейку таблицы на первой вкладке, я нажимаю другой контроллер панели вкладок, поэтому я хотел бы скрыть панель вкладок родительского элемента управления tabbar, а когда я нажму кнопку "Назад" на панели навигации Я хотел бы снова увидеть родительскую панель вкладок, так как я нахожусь в своем представлении на панели родительских таблиц.
Я попробовал hidesbottombarwhenpushed, и он скрывает панель вкладок панели родительских вкладок, но когда я нажимаю на нее, она не возвращает ее обратно.
Ответы
Ответ 1
Хорошо, наконец, я получил свой ответ, вот что я должен делать.
self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:aViewController animated:YES];
self.hidesBottomBarWhenPushed=NO;
Итак, в основном скрываетBottomBarWhenPushed = YES, а затем нажимает ваш контроллер просмотра, а затем скрываетBottomBarWhenPushed = NO; это работает как прелесть.
Благодаря eddy и его сообщению здесь
Ответ 2
У принятого ответа была проблема для меня.
В моем приложении была навигационная система с глубиной 3 UIViewController.
- FirsViewController показывает UITabBar. (Правильный)
- FirsViewController толкает SecondViewController, а SecondViewController не отображает UITabBar. (Правильный)
- SecondViewController подтолкнул ThirdViewController, а ThirdViewController отображает UITabBar. (Неправильная)
- Третий контроллер обратился к SecondViewController, а SecondViewController отображает UITabBar. (Неправильная)
- SecondViewController выталкивается в FirstViewController, а FirstViewController показывает UITabBar. (Правильный)
Решение для меня заключалось в установке делегата UINavigationControllerDelegate
скор:
self.navigationController?.delegate = self
Objective-c:
self.navigationController.delegate = self;
И затем реализуем следующий метод делегата
Swift:
fun navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if fromVC.isKindOfClass(FirstViewController) && toVC.isKindOfClass(SecondViewController) {
self.hidesBottomBarWhenPushed = true;
}
else if fromVC.isKindOfClass(SecondViewController) && toVC.isKindOfClass(FirstViewController) {
self.hidesBottomBarWhenPushed = false;
}
return nil
}
Objective-c:
-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if ([fromVC isKindOfClass:[FirstViewController class]] && [fromVC isKindOfClass:[SecondViewController class]]) {
self.hidesBottomBarWhenPushed = true;
}
else if ([fromVC isKindOfClass:[SecondViewController class]] && [fromVC isKindOfClass:[FirstViewController class]]) {
self.hidesBottomBarWhenPushed = false;
}
return nil;
}
Надеюсь, что это помогло.
Ответ 3
Как указано в документации Apple, вы не можете нажать экземпляр UITabBarController на NavigationController. И для этого есть веская причина: как вы вернетесь из контроллера нажатой панели вкладок, если вы выбрали другой элемент на панели вкладок?
Простой ответ: не делайте этого, он будет путать вашего пользователя. Вы можете попробовать заменить первый контроллер представления для другого контроллера представления, который может быть контроллером панели вкладок, но не используйте для этого парадигму push: вместо этого используйте явную кнопку, которая заменит ваш первый контроллер панели вкладок для второго, предпочтительно используя визуальный переход.
Вы можете посмотреть документацию setAnimationTransition:forView:cache:
для класса UIView
, чтобы знать, как поменять, скажем, контроллер панели вкладок для другого:
- Начните блок анимации.
- Установите переход в виде контейнера.
- Удалить представление в представлении контейнера.
- Добавить новое представление в представление контейнера.
- Заблокировать блок анимации.
В этом случае представление контейнера будет окном приложения.
Ответ 4
Вы также можете скрыть его с помощью инспектора атрибутов при выборе контроллера tabBar
![enter image description here]()
Ответ 5
В вашем приложении FirstViewController
self.hidesBottomBarWhenPushed = true
в вашем приложении SecondViewController
override func willMoveToParentViewController(parent: UIViewController?) {
if parent == nil {
var viewControllers = self.navigationController!.viewControllers
if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstViewController.self)) {
(viewControllers[viewControllers.count - 2] as! FirstViewController).hidesBottomBarWhenPushed = false
}
}
}
Ответ 6
Установите hidesBottomBarWhenPushed = true
в контроллере, который будет нажат.
Для скрытия все контроллеры вставлены в prepare for segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.hidesBottomBarWhenPushed = true
}