NavigationController返回跳过视图

首先,我知道这个问题是以前进的方式提出的,但在这种情况下,我要求一种向后的方式,其中已经设计了导航控制器。 有了这个说……

我有一个UINavigationController有三个视图: TableGetAvail按顺序在IB中创建。

在前进的时候,我想从Table到Go to Avail ,但是当我点击Avail的“Back”按钮时,我想跳过Get并直接返回Table 。 这可能吗? 如果是这样,怎么样?

我是这样做的:

 NSArray *VCs = [self.navigationController viewControllers]; [self.navigationController popToViewController:[VCs objectAtIndex:([VCs count] - 2)] animated:YES]; 

为了能够覆盖导航控制器的后退按钮,您将不得不inheritanceUINavigationController。 看看本教程中的内容: http : //www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller

实现导航控制器的委托方法:

 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

它将为导航控制器堆栈中的所有VC启动。 (在导航控制器之后立即将此代码放入VC中,并将< UINavigationControllerDelegate >放在.h

您要做的是替换整个导航控制器的堆栈,而不要在其中删除要删除的视图控制器。 由于它是一个非可变数组,你必须在删除VC之前将其转换为可变数组,删除VC,然后用调用替换导航控制器的堆栈[self.navigationController setViewControllers:newVCs animated:NO]; 。 这是关键部分。 在加载您所在的页面后,您正在更换堆栈,但由于您保留了VC,因此它仍然是堆栈中的顶级项目,因此对用户没有明显的影响。 只要你在堆栈上没有很多VC,它就不是一个昂贵的电话。

这是我在委托方法中做到的方式:

 //Remove list setup page if new list was created if ([self.navigationController topViewController].class == [ItemViewController class]) { NSArray *VCs = [self.navigationController viewControllers]; if(((UITableViewController*)[VCs objectAtIndex:[VCs count]-2]).class == [NewCardTypeController class]) { NewCardTypeController *removedObject = [VCs objectAtIndex:[VCs count]-2]; if(removedObject != nil) { NSMutableArray *newArray = [NSMutableArray arrayWithArray:VCs]; [newArray removeObject:removedObject]; NSArray *newVCs = [NSArray arrayWithArray:newArray]; [self.navigationController setViewControllers:newVCs animated:NO]; } } } 

看一下UINavigationController的 -popToViewController:animated:-popToRootViewControllerAnimated: ,它完全符合你的要求。 也就是说,它们将导航堆栈弹回特定视图控制器或根视图控制器。 但是,您仍然需要拦截导航控制器的后退按钮操作才能使用它们。