当赛格是模态的时候,执行赛克斯的标识非常慢

我有一个简单的表视图,我处理表视图上的select操作。 这一行动是继续进行的。

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

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

我试着四处寻找一些想法,但似乎没有适用于我的情况。 尤其是:

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

有没有人有任何想法呢?

相信我,试试这个。 我遇到了这个问题几次。

在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) } 

正如这里和这里所讨论的。

接受的解决scheme为我工作。 代码更新为Swift 2.0以下:

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

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

我不知道为什么在某些情况下会发生这种情况,而不是其他情况,但我发现推迟使用asyncperformSegue调用会修复任何潜在的问题。 这曾经看起来像一个黑客,让我紧张,但在这一点上,我有几个成熟的项目使用这种方法,现在看起来像“正确”的方式来做一个手动的继续。

这里是Swift 3版本的代码(请参阅Swift 2和Obj-C版本的其他文章):

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

希望能帮助这个哟在Swift中创build像这样的模式转换:

  let myStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let modalViewController = myStoryboard.instantiateViewControllerWithIdentifier("myModalViewController") as! myModalViewController modalViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical let navController = UINavigationController(rootViewController: accountManager) dispatch_async(dispatch_get_main_queue(),{ self.presentViewController(navController, animated: true, completion: nil) }) 

看来(对我来说)只有当单元格selectionTypetypes不是.none时才会发生这个问题。

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

你可以像以前提到的那样,在UITableViewDelegatedidSelect委托函数的DispatchQueue.main.async{}块中调用segue。

我使用了第一个解决scheme,并添加到单元本身 –

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

这将使单元格突出显示,但它会立即返回到通常的UI,对我来说很好。

我试图修复这种多种方式,包括移动到上面的主线程。 这对我工作:

在故事板中,select有问题的表格视图(在文档大纲中select它,以确保您已经得到了正确的结果)。然后在属性检查器中,您将能够看到表格视图的属性以及下方的包含滚动视图它(所有的表格视图基于滚动视图),这里有一个愚蠢的小盒子,叫做“延迟内容触摸”,取消选中它,还有一个“允许取消触摸”,我想你可以确保没有选中同样,我觉得双重触动正在搞乱我。

Interesting Posts