2011-12-16 53 views
1

首先,我知道这个问题是以正向的方式提出的,但在这种情况下,我要求一种已经设计好导航控制器的倒退方式。有了这样说......NavigationController后退跳过查看

我有一个UINavigationController有三个观点:TableGet,并在在IB创建的顺序Avail

在前进,我想从TableGetAvail,但是当我打Avail“后退”按钮,我想跳过Get并直接回转到Table。这可能吗?如果是这样,怎么样?

回答

9

我是这样做的:

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

+0

然后突然有人(甚至你)更新项目,并删除或添加新的风险投资进入导航控制器堆栈。而你的代码将无法工作(在最好的情况下)。魔法数字总是邪恶的。 – slxl 2017-03-29 02:40:00

2

看看UINavigationController's-popToViewController:animated:-popToRootViewControllerAnimated:,这正是你所要求的。也就是说,他们将导航堆栈弹出回特定的视图控制器或根视图控制器。不过,您仍然需要拦截导航控制器的后退按钮动作才能使用它们。

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]; 
     } 
    } 
} 
+0

顺便说一下,其他答案不会执行的操作是保留正确的导航栏序列,并确保您的后退按钮在转换时将具有正确的动画行为,因为您不会覆盖它。 – Christine 2012-12-01 17:25:35