Как я могу создать глобальный стек навигации? - PullRequest
5 голосов
/ 14 февраля 2012

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

enter image description here

Ответы [ 6 ]

4 голосов
/ 14 февраля 2012

Чтобы достичь этого эффекта, вы можете отказаться от UITabBarController - и эмулировать панель, используя пользовательский вид или настраивая стандартную панель UIToolbar.

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

0 голосов
/ 29 августа 2012

Я получил это работает.По моему опыту мне нужно было иметь mainTabBarController и detailedNavigationController в качестве двух корневых контроллеров.Эти два метода класса UIApplicationDelegate работают идеально:

- (void) showDetailedTab 
{
    CGRect normalRect = self.window.bounds;
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);

    detailedNavigationController.view.frame = rightRect;
    mainTabBarController.view.frame = normalRect;
    [self.window addSubview:mainTabBarController.view];
    [self.window addSubview:detailedNavigationController.view];

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                     animations: ^{
                         detailedNavigationController.view.frame = normalRect;
                         mainTabBarController.view.frame = leftRect;
                     } 
                     completion: ^(BOOL finished){
                         [mainTabBarController.view removeFromSuperview];
                     }];
}

- (void) showMainTabBar
{
    CGRect normalRect = self.window.bounds;
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);

    mainTabBarController.view.frame = leftRect;
    detailedNavigationController.view.frame = normalRect;
    [self.window addSubview:mainTabBarController.view];
    [self.window addSubview:detailedNavigationController.view];

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                     animations: ^{
                         mainTabBarController.view.frame = normalRect;
                         detailedNavigationController.view.frame = rightRect;
                     } 
                     completion: ^(BOOL finished){
                         [detailedNavigationController.view removeFromSuperview];
                     }];
}

Я думаю, что это решение лучше, чем эмуляция панели вкладок, поскольку она не нарушает жизненный цикл UIViewContoller.

0 голосов
/ 14 февраля 2012

У меня была похожая проблема.Я сделал это так:

Чтобы изменить вкладку, используйте: скажем, вы хотите перейти на вкладку 2 и его 3-й контроллер представления

self.tabBarController.selectedIndex = 2;

[self.tabBarController.delegate tabBarController:self.tabBarController didSelectViewController:
     [[[self.tabBarController.viewControllers objectAtIndex:2] viewControllers] objectAtIndex:3]];
0 голосов
/ 14 февраля 2012

Я предлагаю вам создать глобальный массив (NSMutableArray), который будет содержать объекты NSInvocation. Поэтому каждый раз, когда вы нажимаете контроллер представления, вам нужно создать NSInvocation с контроллером навигации в качестве цели и popViewConrollerAnimated: в качестве селектора. Если вы касаетесь элемента панели вкладок, вам нужно установить контроллер панели вкладок в качестве цели и setSelectedViewController: в качестве селектора. Вы также должны указать текущий контроллер вида в качестве параметра, используя

- (void)setArgument:(void *)buffer atIndex:(NSInteger)index

Тогда каждый раз, когда вы открываете свой глобальный стек, вам нужно просто позвонить [myLastInvocation invoke];

0 голосов
/ 14 февраля 2012

Вы хотите, чтобы все UIViewController в UITabBarController были загружены в один и тот же UINavigationController?

Так что-то вроде этого:

          ___ RootViewController ___
         |                           |
UINavigationController        UITabBarViewController

вместо

               RootViewController
                        |
     _________ UITabbarViewController _____________________
    |                           |                          |
UINavigationController   UINavigationController    UINavigationController

Вы должны попробовать "поэкспериментировать" со своим собственным обычаем UITabBar

0 голосов
/ 14 февраля 2012

вы можете добиться того же, установив левую кнопку панели вашего UINavigationController в качестве кнопки по вашему выбору. Обработайте метод действия и вызовите соответствующую кнопку панели вкладок при событии щелчка.

Вам нужно сделатьвсе, что в вашем контроллере корневого представления ...

ДОБАВЛЕНО:

Не удалось получить кнопку возврата на контроллерах корневого представления (контроллеры навигации; связано корневое представление)с вашим экземпляром панели вкладок), просто нажав кнопку панели вкладок.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...