需求:点击tableview的Cell需要弹出一个系统的提示框
问题: 发现提示框的出现会有延迟,但我没有任何延迟操作,这问题让我很是难受,排查了半天最后还是百度出了问题所在。
问题代码:
//MARK: - 系统登出
static func logOut() {
//获取当前VC
let vc = UIViewController.currentViewController()
if vc == nil {
return
}
//弹出提示框
let alertVC = UIAlertController(title: "提示", message: "是否退出登录", preferredStyle: .alert)
let sureAction = UIAlertAction(title: "确定", style: .default) { [unowned vc] (_) in
MBProgressHUD.showTextHUD("已登出")
UserDefaults.removeAll()
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
vc?.navigationController?.popToRootViewController(animated: true)
}
}
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
alertVC.addAction(sureAction)
alertVC.addAction(cancelAction)
vc?.present(alertVC, animated: true, completion: nil)
}
这是一个退出的提示框,在tableViewCell的点击方法中弹出。
原因:cell的点击点击效果去除时就会出现这个问题。
self.selectionStyle = .none
当点击Cell时,UI的变化没有立刻的发生在主线程,而是经过一系列的操作之后在主线程刷新UI。
解决方法:
- 不用self.selectionStyle = .none,改用代理方法去除点击效果
- 手动调起主线程进行UI刷新。
DispatchQueue.main.async {
vc?.present(alertVC, animated: true, completion: nil)
}