从多个自定义 segue 展开到根控制器时崩溃

Posted

技术标签:

【中文标题】从多个自定义 segue 展开到根控制器时崩溃【英文标题】:Crash while unwinding to the root controller from multiple custom segues 【发布时间】:2015-08-28 16:11:00 【问题描述】:

我需要实现自定义 segue,最多可堆叠 3 次,并通过整个堆栈展开回根视图控制器。

这是我的转场代码:

- (void)perform 

    UIViewController* sourceViewController = self.sourceViewController;

    UIView* firstVCView = [(UIViewController*)self.sourceViewController view];
    UIView* secondVCView = [(UIViewController*)self.destinationViewController view];

    // Get the screen width and height.
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;

    // Specify the initial position of the destination view.
    secondVCView.frame = CGRectMake(screenWidth, 0, screenWidth, screenHeight);

    // Access the app's key window and insert the destination view above the current (source) one.
    UIWindow* window = [UIApplication sharedApplication].keyWindow;

    [window insertSubview:secondVCView aboveSubview:firstVCView];

    [UIView animateWithDuration:0.5 animations:^
        firstVCView.frame = CGRectOffset(firstVCView.frame, -screenWidth, 0);
        secondVCView.frame = CGRectOffset(secondVCView.frame, -screenWidth, 0);
     completion:^(BOOL finished) 
        [sourceViewController.navigationController presentViewController:self.destinationViewController animated:NO completion:nil];
    ];

对于放松转场:

- (void)perform 

    UIViewController* sourceViewController = self.sourceViewController;

    UIView* secondView = [(UIViewController*)self.sourceViewController view];
    UIView* firstView = [(UIViewController*)self.destinationViewController view];

    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;

    UIWindow* window = [UIApplication sharedApplication].keyWindow;

    [window insertSubview:firstView aboveSubview:secondView];

    [UIView animateWithDuration:0.5 animations:^
        firstView.frame = CGRectOffset(firstView.frame, screenWidth, 0);
        secondView.frame = CGRectOffset(secondView.frame, screenWidth, 0);
     completion:^(BOOL finished) 
        [sourceViewController.navigationController dismissViewControllerAnimated:NO completion:nil];

    ];

单次转换一切正常 - 我也可以轻松前进和放松。 但是,当我向前执行两个或多个转换并尝试在之后放松时,即使在任何代码调用之前,当我按下与 unwind segue 关联的按钮时,就会发生以下错误:

2015-08-28 18:40:37.460 ProjectName[17807:973012] *** -[UIStoryboardUnwindSegueTemplate performSelector:withObject:withObject:]: message sent to deallocated instance 0x7fbd4bc717d0

显然它最后一个控制器丢失了。 但是,如果我将它和整个以前的控制器堆栈锁定在内存中,那么除了方法调用“prepareForSegue”之外什么都不会发生:没有调用其他委托方法,没有抛出异常,没有执行转换。 此外,当所有控制器都锁定在内存中时,我尝试调用 popToRootViewControllerAnimated 和其他类似方法 - 也没有任何结果。

我想不出如何修复它并阅读整个互联网以寻求解决方案。我该如何解决?

【问题讨论】:

【参考方案1】:

问题出在这一行的自定义 segue 中:

[sourceViewController.navigationController presentViewController:self.destinationViewController animated:NO completion:nil];

我应该 pushViewController 而不是 presentViewController:

[sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];

现在,当我改变它时,一切都像魅力一样。希望它可以帮助某人。

【讨论】:

以上是关于从多个自定义 segue 展开到根控制器时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Segue 以查看控制器崩溃

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview

(Swift)当多个视图控制器导致相同的视图时展开 segue?

展开多个导航控制器

在多个故事板环境中展开 segue

使用情节提要逆转自定义 Segue