Замените UIViewController в иерархии UINavigationController

Как насчет нажатия петель до их конечных пределов

    for(var a=0; a<data_a.length; a++){
       for(var b=0; b<data_b.length; b++){
           for(var c=0; c<data_c.length; c++){
              for(var d=0; d<data_d.length; d++){
                 a =  data_a.length;
                 b =  data_b.length;
                 c =  data_b.length;
                 d =  data_d.length;
            }
         }
       }
     }
29
задан 0x8badf00d 24 December 2011 в 21:52
поделиться

8 ответов

Довольно просто, когда нужно нажать третийViewController вместо простого 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.

53
ответ дан Shaheen Ghiassy 24 December 2011 в 21:52
поделиться
NSMutableArray *viewController = [NSMutableArray arrayWithArray:[navController viewControllers]];
[viewController replaceObjectAtIndex:1 withObject:replacementController];
[navController setViewControllers:viewController];

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

23
ответ дан Necreaux 24 December 2011 в 21:52
поделиться

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

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

с помощью кнопки «Назад» thirdViewController

2
ответ дан Ivano 24 December 2011 в 21:52
поделиться

Более чистый путь в Свифте должен быть:

extension UINavigationController {
  func replaceTopViewController(with viewController: UIViewController, animated: Bool) {
    var vcs = viewControllers
    vcs[vcs.count - 1] = viewController
    setViewControllers(vcs, animated: animated)
  }
}
8
ответ дан duan 24 December 2011 в 21:52
поделиться
extension UINavigationController {

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

}
1
ответ дан Harris 24 December 2011 в 21:52
поделиться

Невозможно анимировать переход, если вы просто замените 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];
}
4
ответ дан pb2q 24 December 2011 в 21:52
поделиться
- (void)swapTopViewController:(UIViewController *)topViewController{
    NSArray *viewControllers = [self.navigationController viewControllers];
    NSMutableArray *editableViewControllers = [NSMutableArray arrayWithArray:viewControllers];
    [editableViewControllers removeLastObject];
    [editableViewControllers addObject:topViewController];
    [self.navigationController setViewControllers:editableViewControllers];
}
1
ответ дан Tunaki 24 December 2011 в 21:52
поделиться

Версия Swift 4:

if var viewControllers = navigationController?.viewControllers {
    viewControllers[viewControllers.count - 1] = newViewController
    navigationController?.viewControllers = viewControllers
}
2
ответ дан Skoua 24 December 2011 в 21:52
поделиться