当segue是模态时,performSegueWithIdentifier非常慢

时间:2015-02-13 21:43:47

标签: ios objective-c swift segue

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

如果segue是push segue,则立即显示下一个视图。 如果segue是modal segue,则下一个视图:

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

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

  • 我正在主UI线程上执行segue
  • 我的观点很简单(所以viewDidLoad中没有问题)。此外,当segue为push时,它显示近乎瞬时显示加载目标视图没有问题
  • 我尝试将nil传递给sender;同样的效果。

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

8 个答案:

答案 0 :(得分:89)

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

在Swift 2中:

dispatch_async(dispatch_get_main_queue(),{
    self.performSegue(withIdentifier:mysegueIdentifier,sender: self)
})

或Swift 3:

DispatchQueue.main.async {
    self.performSegue(withIdentifier: mysegueIdentifier,sender: self)
}

正如herehere所述。

答案 1 :(得分:5)

似乎(对我来说......)只有当单元格selectionType不是.none时才会出现此问题。

您可以将其更改为任何其他选项(在故事板Attribute inspector,设置Selection字段),它将正常工作(为我工作......)。 缺点是它弄乱了单元格UI。

您可以在人DispatchQueue.main.async{}的{​​{1}}代理函数中didSelect阻止UITableViewDelegate块中的segue。

我使用了第一种解决方案并在细胞本身添加了

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(false, animated: false)
}

这将使细胞突出显示'在水龙头,但它会立即返回其通常的用户界面,对我来说很好......

答案 2 :(得分:3)

执行segue时,似乎有各种情况无法正常工作。例如,如果从unwind segue的动作处理程序中调用performSegue,即使您在主线程上,也会遇到各种问题。在我当前的项目中,我从表视图的performSegue方法调用didSelectRowAt。这是最基本的部分之一,当然我是主线程,但我看到了OP所描述的确切症状。

我不知道为什么在某些情况下会发生这种情况,而不是其他情况,但我发现使用performSegue延迟async来电可以解决任何潜在问题。这曾经看起来像一个黑客并让我感到紧张,但在这一点上,我有几个成熟的项目使用这种方法,现在看起来像#34;对"做手动的方式。

以下是Swift 3版本的代码(请参阅Swift 2和Obj-C版本的其他帖子):

DispatchQueue.main.async {
    self.performSegue(withIdentifier: "theIdentifier", sender: theSender)
}

答案 3 :(得分:2)

接受的解决方案对我有用。代码更新于下面的Swift 2.0:

dispatch_async(dispatch_get_main_queue(),{
     self.performSegueWithIdentifier(mysegueIdentifier, sender:self)
})

答案 4 :(得分:1)

希望帮助这个你可以在Swift中创建这样的程序模态转换:


        Dim ctl As Control

        For Each ctl In Me.Controls

            If TypeOf ctl Is MdiClient Then
                ctl.BackColor = Color.Yellow
                ctl.BackgroundImageLayout = ImageLayout.Stretch
                ctl.BackgroundImage = Image.FromFile("C:\Image.png")
            End If

        Next

答案 5 :(得分:1)

对于通过子类化来组织代码的开发人员,我已经找到了一个非常简单的解决方案,我想分享(Swift 4):

import UIKit

class ABCViewController: UIViewController {

  // ... Other useful methods like overriding deinit and didReceiveMemoryWarning

  // Performs a segue on the main thread to ensure it will 
  // transition once a UI-slot is available
  func performSegueOnMainThread(with identifier: String, sender: Any?) {
    DispatchQueue.main.async {
      self.performSegue(with: identifier, sender: sender)
    }
  }
}

然后,只需从您的实现中调用它:

myViewController.performSegueOnMainThread(with: "ShowDetailsSegue", sender: self)

答案 6 :(得分:0)

对我来说,下一个视图中有太多“清除”彩色视图,因此当对动画进行动画处理时,它似乎因此而延迟。我遍历了视图控制器的UI层次结构,以寻找清晰的颜色并将其替换为纯黑色或白色,并确保alpha为1(如果不需要,则为1)。我的延迟现在消失了,模态演示也很顺利。

答案 7 :(得分:-1)

我尝试修复这种方法,包括将其移动到上面的主线程。这对我有用:

在故事板中,选择有问题的表格视图,(在文档大纲中选择它以确保您有正确的东西。然后在属性检查器中,您将能够看到表格视图的属性以及在它下面包含scrollview(所有的表视图都基于滚动视图)。这里有一个叫做“延迟内容触摸”的愚蠢的小盒子。取消选中它。还有一个“允许可取消的触摸”,我想你想要制作它肯定也是不受限制的,因为我认为双重打击让我搞砸了。