2011-12-24 4 views
23

У меня есть приложение для iPhone, которое использует стандартную реализацию UINavigationController для навигации по приложению.Заменить UIViewController в иерархии UINavigationController

Я пытаюсь найти способ заменить контроллер вида в иерархии. Другими словами, мое приложение загружается в rootViewController, и когда пользователь нажимает кнопку, приложение нажимает на firstViewController. Затем пользователь нажимает другую кнопку для навигации по приложению до secondViewController. Опять же, использование переходит к другому контроллеру представления, thirdViewController. Тем не менее, я хочу, чтобы BackButton thirdViewController возвращался в firstViewController.

По существу, когда пользователь нажимает thirdViewController, я бы хотел, чтобы он заменил secondViewController в навигационной иерархии.

Возможно ли это? Я знаю, что он использует три20, но я не в этом случае. Тем не менее, если это возможно в Three20, то, безусловно, нужно использовать прямые вызовы SDK. У кого-нибудь есть мысли?

Приветствия, Brett

+0

Я также хотел бы посмотреть в UNWIND перетекает, они полезны для достижения такого рода вещи. Awesome SO ответьте на них здесь: http://stackoverflow.com/questions/12561735/what-are-unwind-segues-for-and-how-do-you-use-them – jrisberg

+0

В данном примере, не так ли просто поп (который избавится от второго), а затем нажмите (у вас теперь есть 1-3). В качестве альтернативы, если это «другая кнопка», когда вы на 1-2-3, просто нажмите дважды, и вы будете на 1. – Fattie

ответ

41

Довольно просто, когда собирается выдвинуть thirdViewController вместо того, чтобы делать простой pushViewController сделать это:

NSArray * viewControllers = [self.navigationController viewControllers]; 
NSArray * newViewControllers = [NSArray arrayWithObjects:[viewControllers objectAtIndex:0], [viewControllers objectAtIndex:1], thirdController,nil]; 
[self.navigationController setViewControllers:newViewControllers]; 

где [viewControllers objectAtIndex:0] и [viewControllers objectAtIndex:1] ваши RootViewController и ваш FirstViewController.

22
NSMutableArray *viewController = [NSMutableArray arrayWithArray:[navController viewControllers]]; 
[viewController replaceObjectAtIndex:1 withObject:replacementController]; 
[navController setViewControllers:viewController]; 

Смотрите UINavigationController class reference для получения дополнительной информации.

+0

Спасибо, приятель. Это решение обработало это. Приветствия. – Felipe

4

Невозможно анимировать переход, если вы просто замените viewController в массиве контроллера вида контроллеров навигации. Я бы рекомендовал сделать следующее в методе viewWillAppear третьего контроллера вида.

-(void) viewWillAppear:(BOOL)animated 
{ 
    NSArray *vCs=[[self navigationController] viewControllers]; 
    NSMutableArray *nvCs=nil; 
    //remove the view controller before the current view controller 
    nvCs=[[NSMutableArray alloc]initWithArray:vCs]; 
    [nvCs removeObjectAtIndex:([nvCs count]-2)]; 
    [[self navigationController] setViewControllers:nvCs]; 
    [super viewWillAppear:animated]; 
} 
2

Поскольку вы просто пытаетесь дважды выскочить из ViewControllers стека, вы, вероятно, может получить тот же результат, вызвав

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 

с задней кнопкой thirdViewController

1
- (void)swapTopViewController:(UIViewController *)topViewController{ 
    NSArray *viewControllers = [self.navigationController viewControllers]; 
    NSMutableArray *editableViewControllers = [NSMutableArray arrayWithArray:viewControllers]; 
    [editableViewControllers removeLastObject]; 
    [editableViewControllers addObject:topViewController]; 
    [self.navigationController setViewControllers:editableViewControllers]; 
} 
0

Swift 2.2:

if var viewControllers = navigationController?.viewControllers { 
    viewControllers[viewControllers.count - 1] = newViewController 
    navigationController?.viewControllers = viewControllers 
} 
2

уборщик путь в Swift должен быть:

extension UINavigationController { 
    func replaceTopViewController(with viewController: UIViewController, animated: Bool) { 
    var vcs = viewControllers 
    vcs[vcs.count - 1] = viewController 
    setViewControllers(vcs, animated: animated) 
    } 
} 
1
extension UINavigationController { 

    func setTop(viewController: UIViewController) { 
     viewControllers = [viewController] 
    } 

} 
+0

не удалял бы все из них, а оставил бы только один ??? – Fattie

+0

@ Fattie yep. Этого было бы достаточно для сценария OP. Эта функция устанавливает верхний viewController. Если вы не хотите этого поведения, вам понадобится другая функция. – Harris

+1

Понял. хороший материал. – Fattie

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