首先,我知道这个问题是以前进的方式提出的,但在这种情况下,我要求一种向后的方式,其中导航控制器已经设计好了。有了这样说......
我有一个UINavigationController
有三个观看次数:Table
,Get
和Avail
按照在IB中创建的顺序。
前进时,我想从Table
转到Get
到Avail
,但当我点击Avail
上的“后退”按钮时,我想跳过Get
并直接返回Table
。这可能吗?如果是这样,怎么样?
答案 0 :(得分:10)
我是这样做的:
NSArray *VCs = [self.navigationController viewControllers];
[self.navigationController popToViewController:[VCs objectAtIndex:([VCs count] - 2)] animated:YES];
为了能够覆盖导航控制器的后退按钮,您必须继承UINavigationController的子类。查看本教程中的内容:http://www.hanspinckaers.com/custom-action-on-back-button-uinavigationcontroller
答案 1 :(得分:3)
实施导航控制器的委托方法:
- (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];
}
}
}
答案 2 :(得分:2)
查看UINavigationController's -popToViewController:animated:
和-popToRootViewControllerAnimated:
,它们正是您所要求的。也就是说,它们将导航堆栈弹回特定视图控制器或根视图控制器。但是,您仍然需要拦截导航控制器的后退按钮操作才能使用它们。