Условно пропускание UIViewController в приложении iOS 5 с помощью UINavigatonController

В нашем приложении iOS с тремя UIViewController один за другим, мы хотели бы пропустить средний на основе некоторого условия и перейти непосредственно от первого к третьему. Тем не менее, пользователь должен иметь возможность вернуться ко второму через кнопку "Назад" на третьем контроллере.

Я пробовал [self performSegueWithIdentifier:@"segueId" sender:sender]; из viewDidLoad, viewWillAppear, но это искажает панель навигации, как указано журналом отладки. Вызов этого кода из viewDidAppear работает отлично, но затем отображается второе представление, чего я пытался избежать в первую очередь.

Я также пробовал [self.navigationController pushViewController:vc animated:NO];, но результат аналогично поврежден на навигационной панели, хотя на этот раз журнал отладки не имеет таких записей.

Каким будет поддерживаемый способ сделать это (если это вообще возможно)?

Целью является iPhone4 с iOS 5.1, а среда dev - Xcode 4.3.

Ответ 1

Я использую следующий код в приложении. Работает точно так, как ожидалось.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    SecondViewController *secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
    if (indexPath.row == 0) {
        // skip second vc
        ThirdViewController *thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ThirdViewControllerViewController"];
        [self.navigationController pushViewController:secondVC animated:NO];
        [self.navigationController pushViewController:thirdVC animated:YES];
    }
    else {
        // push second vc
        [self.navigationController pushViewController:secondVC animated:YES];
    }
}

Ответ 2

Если вы хотите пропустить контроллер вида, вы можете просто вызвать UINavigationController setViewControllers:animated: Он будет анимировать последний контроллер в поставляемом массиве, и пользователь сможет "вернуться" из этого стека.

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

NSMutableArray* newViewControllers = [[navController.viewcontrollers mutablecopy] autorelease];

[newViewControllers addObject: ...];

[navController setViewControllers: newViewControllers animated: YES];