【问题标题】:Perform segue and push 2 viewcontrollers执行 segue 并推送 2 个视图控制器
【发布时间】:2015-12-03 09:56:19
【问题描述】:

我正在尝试使用 prepareForSegue 方法同时推送一定数量的控制器,但出现此错误:

嵌套推送动画可能导致导航栏损坏 和 在意外状态下完成导航转换。导航栏子视图树可能已损坏。

代码如下:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {    
    if ([[segue identifier] isEqualToString:@"rawSegue"]){
        MyController * aController = [segue destinationViewController];
        [aController setText:theText];
        [aController setType:Type];
        [aController setCountry:country];
    }
}

为 NSMutableArray 中包含的每个对象调用 prepareForSegue 方法。如何调用多个视图控制器而不出现此错误? Segue 使用正确的标识符连接到情节提要中。

【问题讨论】:

  • 你能粘贴你用来推送视图控制器的确切代码
  • 问题不清楚,你想用segue同时推送两个控制器吗?同时显示多个 ViewController 或打开队列中的控制器?
  • 警告说明了一切。如果在结束一个转换之前推送多个视图控制器可能会导致导航栏损坏。也就是说,如果您按下后退按钮,它可能会弹出顶视图控制器,您可能无法弹出其他视图控制器,或者您可以弹出一个视图控制器,并且可能有后退按钮没有效果等。
  • 所以基本上答案是我不能用相同的 prepareForSegue 推送多个视图控制器,对吗?

标签: ios objective-c segue


【解决方案1】:

如果你想将多个 UIViewControllers 推送到导航控制器中,你应该添加所有没有动画的,除了最后一个。例如

/**
 A method to push multiple UIViewControllers into UINavigationController. 
 You can push multiple controller, but the trick is you push them without animation, 
 only last is pushed with animation.
 @param arrayControllers An array of UIViewController to be pushed at once in Navigation Controller
 */
-(void)pushMultipleViewControllers:(NSMutableArray<UIViewController *> *)arrayControllers
{
    int index = 0;
    for (UIViewController *controller in arrayControllers) {
        BOOL isAnimated = NO;
        if(index==arrayControllers.count-1){
            //Only last view controller should be inserted with animation
            isAnimated=YES;
        }
        [self.navigationController pushViewController:controller animated:isAnimated];
        index++;
    }
}

【讨论】:

  • 好吧,我应该用哪种方法写这个?最后但同样重要的是:viewController 的数量是动态的,因为它们来自 NSMutableArray...
  • 我已经更新了代码,以便您可以将 NSMutableArray 传递到单个方法中。当您想要推送控制器而不是 segue 时,您应该手动调用此方法。例如在按钮单击或 cellSelectedAtIndex 等上调用此方法。
  • 我可以在prepareFor Segue方法中做同样的事情吗?
【解决方案2】:

上面的答案有更简洁的方法:

- (void)pushMultipleViewControllers:(NSMutableArray<UIViewController *> *)arrayControllers {

    NSMutableArray *navigationControllerStack = self.navigationController.viewControllers.mutableCopy;

    [navigationControllerStack addObjectsFromArray:arrayControllers];

    [self.navigationController setViewControllers:navigationControllerStack animated:YES];

}

请注意,这仍然没有解决如何使用 segue 进行操作,但上面的答案也没有。

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多