TableViewCell 上 UIAlertController 延迟弹出问题
如果你模态弹出一个ViewControllerA,而ViewControllerA 上加载了一个 tableView,如果你在tableViewCell 上 加了一个 alert,你会发现alert 会延迟 2~3秒才弹出,很烦! 你也可以双击cell,alert 虽然不会延迟了,但是这种操作明显是多余的。
(备注:目前只发现模态弹出的ViewController会出现alert延迟问题,其它方式加载的ViewController则没有问题)
参考了这位老兄:http://www.jianshu.com/p/fed4cc7c8c94 的文章, 你会发现出现这种问题的原因竟然是 在
cellForRowAtIndexPath 方法里将 cell 的选择状态(selectionStyle)设置为 None,匪夷所思!(cell.selectionStyle = UITableViewCellSelectionStyleNone;)
其解释为:点击事件发生后没有处理UI变动,或者加到其他线程中了,主线程经过一次(或多次)循环后才发现此需要刷新UI,然后才会刷新UI
再看看以下两个解决方案:
方案一:
如上文所说,不要设置 cell.selectionStyle = UITableViewCellSelectionStyleNone;即可,可是不设置为None,点击cell时tableView上会出现阴影,很不美观。这时候需要在 didSelectRowAtIndexPath 方法里加一句代码,即可消除cell上的阴影 [tableView deselectRowAtIndexPath:indexPath animated:YES];
综上所述:
1.cellForRowAtIndexPath 里 不要设置:cell.selectionStyle = UITableViewCellSelectionStyleNone;
2.didSelectRowAtIndexPath 里 设置: [tableView deselectRowAtIndexPath:indexPath animated:YES];
方案二:
既然上文指出 是因为 线程 的原因导致UI没没处理,那我们可以直接将 UI 弹出的代码放到 主线程 中执行:
dispatch_async(dispatch_get_main_queue() , ^{
[self presentViewController:alert animated:YES completion:nil];
});
图示如下: