放松 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 永远放松的主要内容,如果未能解决你的问题,请参考以下文章

如何放松segue退后几步?

放松 Segue 还是别的啥?

segue放松后,TableView消失

放松Segue隐藏标签栏

在 unwind segue 之后执行 push segue

DMS深层肌肉松解仪放松效果好吗?