从多个自定义 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 后重新加载 UIView 数据上的自定义 tableview