我有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()
}
答案 0 :(得分:0)
从self.present
内调用func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
是这里的原因,因为UIPresentationController
可能需要花费一些时间才能从表视图行选择中找到布局,并且会延迟以模态方式显示新控制器。
一种更好的呈现方式是在主线程上使用DispatchQueue
。这样可以避免延迟。
DispatchQueue.main.async {
//Your Presentation code should be called here....
}