2011-02-13 145 views
10

我想推视图控制器到堆栈上,然后弹出第一个推新的。如何在推送的视图控制器下弹出视图控制器?

-(void) someMethod { 
    MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init]; 
    [self.navigationController pushViewController:tempVC animated:YES]; 
    [tempVC release]; 

    // pop this VC, how? 
} 

编辑:原来,曾经与新VC完成后,我可以弹回2个视图控制器来代替。仍然不是我想要的,但它的工作原理。缺点是我需要设置一个标志来指示已覆盖的视图已完成。

+0

为什么你wan't做到这一点? – 2011-02-13 18:07:06

+0

应用程序的要求。或者,我可以弹出当前的视图控制器,然后推下一个,但当前视图将在完成推送之前释放。 – TigerCoding 2011-02-13 18:10:25

回答

16

这里的弹出背面有两个视图控制器的技术,它具有当前视图控制器及其navigationController属性的你,只要你做的第一个弹出走开的一个类似的问题:

// pop back 2 controllers on the stack to the setup screen 
// 

// locally store the navigation controller since 
// self.navigationController will be nil once we are popped 
// 
UINavigationController *navController = self.navigationController; 

// retain ourselves so that the controller will still exist once it's popped off 
// 
[[self retain] autorelease]; 

// Pop back 2 controllers to the setup screen 
// 
[navController popViewControllerAnimated:NO]; 
[navController popViewControllerAnimated:YES]; 

或者,

setViewControllers:动画:在视图控制器的导航控制器堆栈可以直接“当事人”取代 目前导航控制器管理 与的视图控制器指定项目。

  • (无效)setViewControllers:(NSArray的*)动画viewControllers:(BOOL)动画参数 viewControllers的视图控制器 到堆叠放置。该阵列中控制器 的前后顺序 代表导航堆栈中控制器 的新的 自下而上的顺序。因此,添加到阵列的最后一项变为 导航堆栈的顶部项目。 动画如果是,则动画推动 或弹出顶视图控制器。 如果否,请在没有任何动画的情况下更换视图控制器 。讨论您可以使用此方法更新 或 替换当前视图控制器 堆栈,而无需明确推送或弹出每个 控制器。此外, 此方法允许您更新控制器组 而不激活 更改,当您想要将导航控制器返回 以前的状态时,此更改可能适用于启动时间 。

如果动画被启用,该方法 决定过渡的这类型 进行基于项目阵列中的最后一个项目 是否已经在 导航堆栈。如果视图 控制器当前处于堆栈中,但不是最上面的项目,则此 方法使用弹出转换;如果视图 控制器当前处于堆栈中,如果它是 最上面的项目,则不执行转换 。如果视图控制器 不在堆栈上,则此方法使用 推送转换。只执行一个转换 ,但是当转换 完成时, 堆栈的全部内容将被替换为新视图 控制器。例如,如果 控制器A,B和C在 堆栈上并且您设置了控制器D,A, 和B,则此方法使用弹出窗口 转换,并且生成的堆栈 包含控制器D,A和B 。

可用性在以后的iOS 3.0和 。宣布 UINavigationController.h

因此,直接“消失”视图控制器导航堆栈下您,在您的视图控制器的viewDidLoad,你可以这样做:

NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy]; 
[VCs removeObjectAtIndex:[VCs count] - 2]; 
self.navigationController.viewControllers = VCs; 
+0

感谢您的尝试,但导航数组与您所描述的VC数组不兼容,因为它必须是可变的。然而,这并不是真的需要,因为我完成后可以从新的VC中弹出两个VC。不知道为什么我没有发现它。 – TigerCoding 2011-02-13 18:53:19

0

感谢Bogatyr约'navcontroller的viewcontroller数组'上的提示。我只是用我想更改的一个viewcontroller替换整个堆栈,然后注销堆栈中的所有viewcontroller以确保它是唯一的一个!工作很好 - 谢谢!

RatingsTableViewController *newViewController = [[RatingsTableViewController alloc] init]; 
    NSMutableArray * newVCarray = [NSMutableArray arrayWithObjects:newViewController, nil]; 
    self.navigationController.viewControllers = newVCarray; 

    [newViewController release]; 

    NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 

    for (id object in allControllers) { 

      NSLog(@"name VC: %@", object); 
    } 
    [allControllers release]; 
8

我很难弄清楚这一点,所以我想分享我如何得到这个工作。

比方说,你有风险投资VC1为根的堆栈中,然后你把VC2VC2要推VC3但一旦推你不希望用户回去VC2而是VC1(根)。做到这一点的方法是:

//push VC3 from VC2 
[[self navigationController] pushViewController:VC3 animated:YES]; 

// now remove VC2 from the view controllers array so we will jump straight back to VC1 
NSMutableArray *viewHeirarchy =[[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; 
[viewHeirarchy removeObject:self]; 
self.navigationController.viewControllers = viewHeirarchy; 

希望这有助于别人

0
-(void)popToSelf{ 

    NSArray *array = [self.navigationController viewControllers]; 

    for (int i = 0 ; i < array.count ; i++) { 
     UIViewController *currentVC = [array objectAtIndex:i]; 
     if ([currentVC isKindOfClass:[YourViewControllerClass class]]) { 
      [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES]; 
     } 
    } 
} 
相关问题