首页 > 解决方案 > TableView DidSelectRowAt() 延迟

问题描述

您好,我实际上在我的应用程序中使用了 tableview。我有这行代码从 VC 切换到母亲,它在任何地方都可以正常工作:

 let vue = MAINSTORYBOARD.instantiateViewController(withIdentifier: "accueil") as! Accueil
self.present(vue, animated: true, completion: nil)

在我的 tableView 中,我使用函数 DidSelectRowAt (当我单击行/单元格时执行此操作)来执行此操作(切换 VC)但是当我单击它时您已经了解它可以工作但有延迟。这种延迟有时是 1-2 秒,有时是 12 秒,它是随机的。这很奇怪。我指定上面的功能可以立即与按钮和其他功能一起使用。这是代码(我只写重要的东西):

class Horaire: ViewController, UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vue = MAINSTORYBOARD.instantiateViewController(withIdentifier: "accueil") as! Accueil
        self.present(vue, animated: true, completion: nil)

}

和另一类:

class Accueil: ViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad executed")
    }
}

因此,当我单击 tableview 的一个单元格时,它会立即打印“viewDidLoad 已执行”,但 VC 切换仅在随机几秒钟后完成。为什么我有这种延迟以及如何解决它?它不使用 segue

标签: uitableviewswift4.2

解决方案


我想到的第一件事就是将块放在主队列中。我知道didSelectRowAt应该在 UI 线程中运行,但我在互联网上看到了一些关于这件事的投诉。对我来说似乎是一个错误。

class Horaire: ViewController, UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        DispatchQueue.main.async{
        let vue = MAINSTORYBOARD.instantiateViewController(withIdentifier: "accueil") as! Accueil
        self.present(vue, animated: true, completion: nil)
        }
    }
}

你可以看到一些奇怪的原因,这似乎对这些人有用: https ://github.com/HeroTransitions/Hero/issues/79


推荐阅读