当赛格是模态的时候,执行赛克斯的标识非常慢
我有一个简单的表视图,我处理表视图上的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描述的确切症状。
我不知道为什么在某些情况下会发生这种情况,而不是其他情况,但我发现推迟使用async
的performSegue
调用会修复任何潜在的问题。 这曾经看起来像一个黑客,让我紧张,但在这一点上,我有几个成熟的项目使用这种方法,现在看起来像“正确”的方式来做一个手动的继续。
这里是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) })
看来(对我来说)只有当单元格selectionType
types不是.none
时才会发生这个问题。
您可以将其更改为任何其他选项(在故事板Attribute inspector
,设置Selection
字段),它会正常工作(为我工作…)。 缺点是它搞乱了单元的UI。
你可以像以前提到的那样,在UITableViewDelegate
的didSelect
委托函数的DispatchQueue.main.async{}
块中调用segue。
我使用了第一个解决scheme,并添加到单元本身 –
override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(false, animated: false) }
这将使单元格突出显示,但它会立即返回到通常的UI,对我来说很好。
我试图修复这种多种方式,包括移动到上面的主线程。 这对我工作:
在故事板中,select有问题的表格视图(在文档大纲中select它,以确保您已经得到了正确的结果)。然后在属性检查器中,您将能够看到表格视图的属性以及下方的包含滚动视图它(所有的表格视图基于滚动视图),这里有一个愚蠢的小盒子,叫做“延迟内容触摸”,取消选中它,还有一个“允许取消触摸”,我想你可以确保没有选中同样,我觉得双重触动正在搞乱我。