Скрыть TabBar при вставке в стек навигации и вернуть его, когда выскочил из стека навигации - PullRequest
13 голосов
/ 13 февраля 2011

Я пытаюсь сделать следующее.

У меня есть контроллер панели вкладок с двумя вкладками в нем.Обе вкладки являются контроллером навигации с табличным представлением на каждой из них.

Теперь, когда я выбираю одну ячейку таблицы на первой вкладке, я нажимаю другой контроллер панели вкладок, поэтому я хотел бы скрытьпанель вкладок родительского tabbarcontroller, и когда я нажимаю кнопку «Назад» на панели навигации, я хотел бы снова увидеть родительскую панель вкладок, так как я нахожусь в представлении родительской панели вкладок.

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

Ответы [ 5 ]

38 голосов
/ 14 февраля 2011

Хорошо, наконец-то я получил свой ответ, это то, что я должен делать.

self.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:aViewController animated:YES];
self.hidesBottomBarWhenPushed=NO;

Таким образом, в основном hidesBottomBarWhenPhed = YES, а затем нажмите контроллер представления, а затем hidesBottomBarWhenPush = NO; это работает как шарм.

Спасибо Эдди и его посту здесь

5 голосов
/ 19 октября 2015

Принятый ответ имел проблему для меня.

У моего приложения была навигация с глубиной три UIViewController.

  • Показ FirsViewController - это UITabBar.(Правильно)
  • FirsViewController выдвигает SecondViewController, а SecondViewController не отображает UITabBar.(Правильно)
  • SecondViewController выдвинул ThirdViewController, а ThirdViewController показывает UITabBar.(Неверно)
  • ThirdViewController подключился к SecondViewController, а SecondViewController показывает UITabBar.(Неверно)
  • SecondViewController подключен к FirstViewController, а FirstViewController показывает UITabBar.(Правильно)

Решением для меня было установить делегата UINavigationControllerDelegate

swift:

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;

}

Надеюсь, это помогло.

1 голос
/ 19 июня 2013

Вы также можете скрыть его с помощью инспектора атрибутов при выборе контроллера tabBar

enter image description here

1 голос
/ 14 февраля 2011

Как указано в документации Apple, вы не можете вставить экземпляр UITabBarController в NavigationController.И для этого есть веская причина: как вернуться из контроллера панели вкладок, если вы выбрали другой элемент в панели вкладок?

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

Вы можете посмотреть документацию setAnimationTransition:forView:cache: для класса UIView, чтобы узнать, как заменить, скажем, контроллер панели вкладок на другой:

  1. Beginблок анимации.
  2. Установить переход в представлении контейнера.
  3. Удалить подпредставление из представления контейнера.
  4. Добавить новое подпредставление в представление контейнера.
  5. Фиксация блока анимации.

В этом случае представление контейнера будет окном приложения.

0 голосов
/ 06 февраля 2016

В вашем 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
            }
        }
    }
...