2012-02-10 2 views
4

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

Предположим, что я в закладке 1 нажимаю viewcontroller с именем 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 

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

ответ

8
// 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 любой Больше.

+0

стека С, где я получаю ссылку на 'viewControllerIWantToDisplay'? –

+0

Вам нужно сохранить ссылку на него где-нибудь, я предлагаю класс appDelegate, он легко доступен во всем приложении. Или, если вы уверены, что на 'tab1NavController' будет только один' viewControllerIWantToDisplay', лучший подход может состоять в том, чтобы проверить тип класса, как предлагает BobDev. Но в этом случае вам нужно будет проверить весь массив 'viewControllers', чтобы найти ваш контроллер. – lawicko

0

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

tabbarcontroller.selectedIndex = tabNr; 

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

if([navigationcontroller.topviewcontroller isKindOfClass:[Yourcontroller class]]) 
{ 
    //change tabbar or something else 
} 
1

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

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; 
     } 

    } 
Смежные вопросы