iOS - Отображение контроллера представления уже в стеке навигации - PullRequest
4 голосов
/ 10 февраля 2012

Это, вероятно, легко сортируется, но я не могу понять это. У меня есть приложение панели вкладок с двумя вкладками, каждая вкладка имеет UINavigationController.

Допустим, я на вкладке 1 нажимаю на контроллер вида с именем ItemViewController, затем перехожу на вкладку 2. На вкладке 2 я хочу программно отобразить ItemViewController. Поэтому сначала нужно перейти на вкладку 1, а затем отобразить ItemViewController.

Этого легко добиться, просто нажав на вкладку 1, но я хочу сделать это программно по другим причинам.

Что я делаю сейчас, чтобы добиться этого:

[tab1NavController popToRootViewControllerAnimated:NO];
[tabBarController setSelectedIndex:0];
[tab1NavController pushViewController:itemViewController animated:NO];

Я бы хотел сделать что-то подобное в псевдокоде:

if(viewControllerIWantToDisplayIsOnNavStack)
[tab1NavController presentViewController:viewControllerIWantToDisplay];
else
//instantiate and pushviewcontroller onto stack

Как мне этого добиться?

Ответы [ 3 ]

9 голосов
/ 10 февраля 2012
// check if the desired controller is on the stack in tab 1
if([[tab1NavController viewControllers] containsObject:viewControllerIWantToDisplay]) {
    // desired controller is on the stack, let's see if it's on top
    if(tab1NavController.topViewController == viewControllerIWantToDisplay) {
        // no need to do anything
        }
    else {
        // we need to pop to the desired view controller
        [tab1NavController popToViewController:viewControllerIWantToDisplay animated:NO];
    }
} else {
    // desired controller not on the stack
    [tab1NavController pushViewController:viewControllerIWantToDisplay animated:NO];
}

Так что вам больше не нужно открывать контроллер корневого представления на вкладке 1.

1 голос
/ 03 января 2014

для меня следующий способ работал, я использовал цикл, чтобы проверить, находится ли класс в массиве стека

 NSInteger viewControllersCount = 0;
    UIViewController *rootViewController = nil;
    Yourcontroller *viewController = nil;

    NSArray *viewControllers = self.navigationController.viewControllers;

    viewControllersCount = viewControllers.count - 1;

    for (int i = viewControllersCount ; i > 0 ; i--) {
        rootViewController = [viewControllers objectAtIndex:i];
        if([rootViewController isKindOfClass:[Yourcontroller class]])
        {
            viewController = (NWAAccountViewC *)rootViewController;
            [self.navigationController popToViewController:rootViewController animated:YES];
            break;
        }

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

очень просто программно выбрать другую вкладку, просто сделайте это:

tabbarcontroller.selectedIndex = tabNr;

Но я вижу, вы уже знаете это.Вы можете проверить, является ли контроллер вида сверху в стеке типом контроллера вида, который вам нужен, проверив вот так:

if([navigationcontroller.topviewcontroller isKindOfClass:[Yourcontroller class]])
{
    //change tabbar or something else
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...