放松 segue 永远放松
Posted
技术标签:
【中文标题】放松 segue 永远放松【英文标题】:unwind segue taking forever to unwind 【发布时间】:2014-08-05 13:36:00 【问题描述】:这是我的情况。
我有三个视图控制器,Root、Pushed 和 Leaf。
根是堆栈中最低的。 “Pushed”被 push segue 推动了。 "Leaf" 被模态 segue 放入堆栈。
Root 有这些例程:
-(IBAction) specialSegue:(UIStoryboardSegue*)segue
// Do stuff.
-(void) viewWillAppear:(BOOL)animated
从“Leaf”开始,我调用了一个会触发“specialSegue”的展开转场。这一切都有效。
完全奇怪的是,在“viewWillAppear”被调用之前可以经过几秒钟。我盯着屏幕,等待它放松。我知道我的日志中调用了“specialSegue”。它会立即被调用。但实际的平仓可能会在很久以后发生。有时,如果我再次点击屏幕,在一个甚至不是按钮的地方,视图就会展开并且 viewWillAppear 会被击中。
我想就是这样。非常感谢您对此提供任何帮助。
【问题讨论】:
你如何称呼放松转场?当您从非主线程调用 UIKit 方法时,通常会发生 UI 执行的奇怪延迟。 展开转场被称为按钮按下的直接响应。所以这个动作发生在主线程中。 @jrturton 打败了我。检查您的线程/GDC 代码,这类问题通常是由该错误产生的。 好的,specialSegue 中发生了什么?在等待转换发生时暂停应用会发生什么 - 回溯是什么样的? 什么也没发生。我正在设置一个 NSString 属性。它做得很好,segue 处理结束了。然后我一直等到最后,“viewWillAppear”调用被击中。 【参考方案1】:感谢 jrturton 和布鲁诺。我无法解释,我向你保证,如果我设置断点,调试器会说我正在从主线程调用“performSegue...”。但如果我这样结束通话:
dispatch_async(dispatch_get_main_queue(), ^
[self performSegueWithIdentifier:[self.segues objectAtIndex:row] sender:nil];
);
效果很好。看起来我真的在这里的主线程中,所以上面的代码应该不需要。但它确实解决了我的问题。所以我继续前进。
【讨论】:
以上是关于放松 segue 永远放松的主要内容,如果未能解决你的问题,请参考以下文章