【问题标题】:How do I pop the view controller underneath a pushed view controller?如何在推送的视图控制器下方弹出视图控制器?
【发布时间】:2011-06-26 12:41:09
【问题描述】:

我想将一个视图控制器压入堆栈,然后弹出第一个压入新的视图控制器。

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

    // pop this VC, how?
}

编辑:事实证明,一旦完成新的 VC,我可以弹回 2 个视图控制器。仍然不是我想要的,但它确实有效。缺点是我需要设置一个标志来指示覆盖视图已完成。

【问题讨论】:

  • 你为什么不想这样做?
  • 应用要求。或者,我可以弹出当前视图控制器,然后推送下一个视图控制器,但当前视图控制器会在完成推送之前释放。

标签: iphone ipad uiviewcontroller uinavigationcontroller ipod


【解决方案1】:

这是一种弹出两个视图控制器的技术,它与您的当前视图控制器有类似的问题,并且它的 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:animated: 替换 当前管理的视图控制器 由导航控制器与 指定的项目。

  • (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated 参数 viewControllers 视图控制器 放置在堆栈中。这 控制器从前到后的顺序 在这个数组中代表新的 控制器自下而上的顺序 在导航堆栈中。就这样 添加到数组中的最后一项变为 导航堆栈的顶部项目。 动画如果是,动画推动 或弹出顶视图控制器。 如果否,更换视图控制器 没有任何动画。讨论你 可以使用此方法更新或 替换当前视图控制器 堆栈而不推入或弹出每个 明确的控制器。此外, 此方法可让您更新 没有动画的控制器 变化,这可能是适当的 您想返回的启动时间 导航控制器到 以前的状态。

如果启用了动画,这个方法 决定过渡到哪种类型 根据是否最后一项执行 在 items 数组中已经在 导航堆栈。如果视图 控制器当前在堆栈中, 但不是最上面的项目,这个 方法使用弹出过渡;如果是 最上面的项目,没有过渡是 执行。如果视图控制器是 不在堆栈上,此方法使用 推动过渡。只有一个过渡 被执行,但是当那个过渡 完成后,整个内容 堆栈被新视图替换 控制器。例如,如果 控制器 A、B 和 C 位于 堆栈并设置控制器 D、A、 和 B,此方法使用 pop 转换和结果堆栈 包含控制器 D、A 和 B。

可用性 适用于 iOS 3.0 和 之后。宣布于 UINavigationController.h

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

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

【讨论】:

  • 感谢您的尝试,但导航数组与您描述的 VCs 数组不兼容,因为它必须是可变的。但是,它并不是真正需要的,因为我可以在完成后从新的 VC 中弹出两个 VC。不知道为什么我没有发现它。
  • 刚刚在编辑中添加了一个“可变” - 小错误,但该技术有效。
  • 它不兼容,所以我想我必须制作一个新阵列,删除 vc,然后将阵列放回去?我想知道这是否会导致问题...
  • 好的。我没有在真正的构建中审查代码,但你已经明白了:获取 viewControllers 数组,编辑它,然后将其设置回来。没问题,该 api 专门允许您设置一个新的视图控制器数组,请参阅我的答案中的“setViewControllers”。
【解决方案2】:

我也很难弄清楚这一点,所以我想分享一下我是如何做到这一点的。

假设你有一堆 VC VC1 作为根,然后你推送 VC2 并且你想从 VC2 推送 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;

希望这对其他人有帮助

【讨论】:

  • 其他方法将旧视图控制器的导航项留在堆栈中。现在 iOS 7 引入了 popGestures,这是唯一一个对我正常工作的方法。谢谢!
  • 太好了,这对我也有用。最初我试图在 VC2 推送在 iOS8 中工作的 VC3(在 UINavigationController 的委托方法中)之后执行此操作,但在 iOS7 中,需要在推送后直接执行此操作以使导航项正确弹出。这也意味着更简单的代码!
【解决方案3】:

感谢 Bogatyr 关于“导航控制器的视图控制器阵列上的派对”的提示。我只是用我想要更改的一个视图控制器替换了整个堆栈,然后注销堆栈中的所有视图控制器以确保它是唯一的一个!工作得很好 - 谢谢!

    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];

【讨论】:

    【解决方案4】:
    -(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];
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2012-08-17
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 2012-07-07
      相关资源
      最近更新 更多