当segue是模态时,performSegueWithIdentifier非常慢

tng*_*tng 45 objective-c ios segue swift

我有一个简单的表视图,我在表视图上处理select操作.这个动作遵循一个segue.

如果segue是pushsegue,则立即显示下一个视图.如果segue是modalsegue,则下一个视图:

  • 需要6秒左右才能显示
  • 如果我再次点击(第二次点击)立即显示

我试着四处寻找一些想法,但似乎没有一个适用于我的情况.特别是:

  • 我正在主UI线程上执行segue
  • 我的观点非常简单(所以没有问题viewDidLoad).此外,当segue push表示加载目标视图时没有问题,它显示在瞬时附近
  • 我试过传递nilsender; 同样的效果.

有没有人对此有任何想法?

boi*_*kan 90

相信我,试试这个.我曾经遇到过这个问题几次.

在Swift 2中:

dispatch_async(dispatch_get_main_queue(),{
    self.performSegue(withIdentifier:mysegueIdentifier,sender: self)
})
Run Code Online (Sandbox Code Playgroud)

或者对于Swift 3:

DispatchQueue.main.async {
    self.performSegue(withIdentifier: mysegueIdentifier,sender: self)
}
Run Code Online (Sandbox Code Playgroud)

正如这里这里所讨论的.

  • 所以我最终重新编写了一堆代码,使用`dispatch_async`似乎为我解决了问题.我无法解释为什么,因为我确定我在UI线程上,但也是如此. (3认同)
  • 因为它发生在大约6秒的模态segue中,但是立即响应第二次敲击.每次我遇到这个问题都涉及到同样的事情,并且使用上面答案中的代码解决了问题.非常惊讶它也不适合你.通过打开/关闭动画并且不显示当前上下文来尝试烦躁不安? (2认同)

Yed*_*iss 6

(对我来说)似乎只有在单元格selectionType不在时才会发生此问题.none

您可以将其更改为任何其他选项(在情节提要中Attribute inspector,设置Selection字段),它将正常工作(为我工作...)。缺点是它弄乱了单元界面。

您可以像前面提到的那样DispatchQueue.main.async{}didSelect委托功能的块中调用segue UITableViewDelegate

我使用了第一个解决方案,并添加了单元格本身-

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(false, animated: false)
}
Run Code Online (Sandbox Code Playgroud)

这将使单元格在点击时“突出显示”,但是它将立即返回其通常的UI,对我来说很好...