Segue lag,Swift中的tableview

时间:2017-10-02 17:24:31

标签: ios uitableview

我正在使用Swift 3中的第一个应用程序。我正在使用tableView(通过“扩展MainController:UITableViewDataSource”)。从这个tableView,通过storyboard我有两个segues。一个用于编辑(通过单击附件图标),第二个用于更多详细信息屏幕(通过单击表格行)。我不是通过代码来调用这个segues,而是通过storyboard。

而我的问题是有时存在巨大的滞后。就像点击一行后,下一个屏幕显示30秒后。但现在总是。有时它立即工作。有趣的是,当我触摸第1行时,没有任何反应,接下来我点击第2行,然后第1行出现。

我也在使用委托,这是准备segues的代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 1
    if segue.identifier == "AddSensor" {
        // 2
        let navigationController = segue.destination
            as! UINavigationController
        // 3
        let controller = navigationController.topViewController
            as! AddController
        // 4
        controller.delegate = self
    }
    else if segue.identifier == "EditSensor" {
        let navigationController = segue.destination
            as! UINavigationController
        let controller = navigationController.topViewController
            as! AddController
        controller.delegate = self
        if let indexPath = tableView.indexPath(
            for: sender as! UITableViewCell) {
            controller.sensorToEdit = sensors[indexPath.row]
        }
    }
    else if segue.identifier == "DetailSeq" {
        let navigationController = segue.destination
            as! UINavigationController
        let controller = navigationController.topViewController
            as! DetailController
        controller.delegate = self
        if let indexPath = tableView.indexPath(
            for: sender as! UITableViewCell) {
            controller.sensorRecieved = sensors[indexPath.row]
        }
    }

}

我读到这是iOS8中的常见错误,可以通过添加

来解决
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {  
DispatchQueue.main.async {
    self.performSegue(withIdentifier: "DetailSeq",sender: self)
}
}  

但它对我不起作用。我不知道接下来我该怎么做才能解决这个问题。谁能指导我?

2 个答案:

答案 0 :(得分:0)

根据此SO question,如果您使用代码而不是故事板中的segue显示视图控制器,则可以修复错误。像这样的东西,你的目的地是你想去的VC。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: 
    NSIndexPath) {

    DispatchQueue.main.async {
        self.presentViewController(destination, animated: true) { () -> Void                    
              in

        }
    }
}

答案 1 :(得分:0)

你必须这样使用:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "DetailSeq",sender: self)
    }
}