Спрячьте 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
}