替换UINavigationController层次结构中的UIViewController

Bre*_*ett 29 iphone objective-c

我有一个iPhone应用程序,它使用UINavigationController应用程序导航的标准实现.

我试图找出一种方法来替换层次结构中的视图控制器.换句话说,我的应用程序加载到一个rootViewController用户按下按钮时,应用程序将推送到firstViewController.然后用户按下另一个按钮以将应用程序导航到secondViewController.再次使用导航到另一个视图控制器,thirdViewController.但是,我希望它的BackButton thirdViewController弹回到firstViewController.

基本上,当用户推送时thirdViewController,我希望它secondViewController在导航层次结构中替换.

这可能吗?我知道它正在使用Three20,但我不是在这种情况下.尽管如此,如果它可以在Three20中使用,那么肯定应该使用直接的SDK调用.有人有想法吗?

干杯,布雷特

Eca*_*ion 54

非常简单,当要推送第三个ViewController而不是简单地pushViewController执行此操作时:

NSArray * viewControllers = [self.navigationController viewControllers];
NSArray * newViewControllers = [NSArray arrayWithObjects:[viewControllers objectAtIndex:0], [viewControllers objectAtIndex:1], thirdController,nil];
[self.navigationController setViewControllers:newViewControllers];
Run Code Online (Sandbox Code Playgroud)

其中,[viewControllers objectAtIndex:0][viewControllers objectAtIndex:1]是你的RootViewController的和你FirstViewController.


Jus*_*Sid 23

NSMutableArray *viewController = [NSMutableArray arrayWithArray:[navController viewControllers]];
[viewController replaceObjectAtIndex:1 withObject:replacementController];
[navController setViewControllers:viewController];
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅UINavigationController类参考.


dua*_*uan 10

Swift中更干净的方式应该是:

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