从TableViewController提出模态ViewController滞后

时间:2016-07-25 15:33:10

标签: ios multithreading uitableview cocoa-touch modalviewcontroller

我有UITableViewController,需要在点击单元格时以模态方式呈现视图控制器。我正在使用didSelectRowAt

模态视图控制器是一个自定义的UIViewController子类,它有一个loadFromStoryboard()类方法来加载它。

有时当我点击单元格时,视图控制器会快速呈现而不会出现问题。但是,有时它会显示,直到我,例如,尝试滚动tableview或点击另一个单元格。

我猜这是线程的某种问题。但是,在我的整个应用程序中,我从未将任务委托给另一个线程或根本没有启动另一个队列。

N.B。:我正在使用Swift 3。

更新

以下是loadFromStoryboard()方法:

class func loadFromStoryboard(particle: ParticleProtocol, isFavourite: Bool = false) -> ParticleDisplayViewController {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if let viewController = storyboard.instantiateViewController(withIdentifier: "ParticleDisplayViewController") as? ParticleDisplayViewController {

        viewController.particle = particle
        viewController.isFavourite = isFavourite

        return viewController
    } else {
        fatalError("Can't find ParticleDisplayViewController in Main storyboard")
    }
}

这是来自我的UITableViewController的didSelectRowAt

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath.section {
    case 1:
        let isFavourite = ParticleStorageManager.standardModelParticleIsFavourite(index: indexPath.row)
        self.present(ParticleDisplayViewController.loadFromStoryboard(particle: standardModelParticles[indexPath.row], isFavourite: isFavourite), animated: true, completion: nil)
    case 0:
        let isFavourite = ParticleStorageManager.savedParticleIsFavourite(index: indexPath.row)
        self.present(ParticleDisplayViewController.loadFromStoryboard(particle: self.particles[indexPath.row], isFavourite: isFavourite), animated: true, completion: nil)
    default:
        self.contextKey = "AddingParticle"
        self.present(CreateParticleTableViewController.loadFromStoryboard(reciever: self), animated: true, completion: nil)
    }

}

ParicleStorageManager只是将数据读取并写入UserDefaults

这是来自模态视图控制器的viewDidLoad()

override func viewDidLoad() {
    self.view.backgroundColor = .clear()

    self.particleViewContainer.layoutIfNeeded()
    self.particleViewContainer.addSubview(ParticleView(position: CGPoint.zero, width: particleViewContainer.width, particle: self.particle, isFavourite: self.isFavourite))

    propertiesTableView.backgroundColor = UIColor.white().withAlphaComponent(0.3)
    propertiesTableView.layer.borderWidth = 1.5
    propertiesTableView.layer.borderColor = UIColor.black().cgColor
    self.propertiesTableView.blur()
}

1 个答案:

答案 0 :(得分:0)

self.present内调用func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)是这里的原因,因为UIPresentationController可能需要花费一些时间才能从表视图行选择中找到布局,并且会延迟以模态方式显示新控制器。

一种更好的呈现方式是在主线程上使用DispatchQueue。这样可以避免延迟。

 DispatchQueue.main.async {
           //Your Presentation code should be called here.... 
   }