NavigationController返回跳过视图

时间:2011-12-16 19:53:21

标签: objective-c ios uinavigationcontroller

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

我有一个UINavigationController有三个观看次数:TableGetAvail按照在IB中创建的顺序。

前进时,我想从Table转到GetAvail,但当我点击Avail上的“后退”按钮时,我想跳过Get并直接返回Table。这可能吗?如果是这样,怎么样?

3 个答案:

答案 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:,它们正是您所要求的。也就是说,它们将导航堆栈弹回特定视图控制器或根视图控制器。但是,您仍然需要拦截导航控制器的后退按钮操作才能使用它们。