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];

            });



图示如下:

TableViewCell 上 UIAlertController 延迟弹出问题