前言:在这次App版本迭代进入集成测试阶段尾声,正式环境打包release环境后,测试回归发现许多包含 tableView 的页面都无法响应点击事件。但是在 debug 环境下从开发功能到滚动测试流程,一直都是没问题的。开始时,真的是百思不得其解
开发环境:
Xcode10.2.1 swift 5.0 涉及的类关系: 父类:BaseTableViewController 拥有成员变量 UITableView 子类:SubTableViewController 继承自 BaseTableViewController 父类遵循 UITableViewDelegate 与 UITableViewDataSource 代理,由子类 SubTableViewController 覆写实现具体的代理方法。
问题症结:
- debug 模式下真机与模拟器调试,遵循的代理方法都可以正常执行;
- release 模式打包出来后,子类中覆写的 TableView 相关协议
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
与func numberOfSections(in tableView: UITableView)
方法无法正常执行,导致页面显示错误与点击事件无响应;
问题原因:
Xcode 10.2 版本打包编译 bug。在查阅了大量的资料后,最终得出了这个怎么也没想到的结果。 从官方论坛的 bug 反馈中,找到了证据:Inference of @objc from witnessed protocol requirement fails sometimes
解决方案:
- 使用 Xcode 10.1 打包上线(若使用 swift 5 版本,此方案无效);xcode 10.2.1 swift UITableView部分协议方法不执行
- 在子类中要覆写代理实现的方法前,添加 @objc ;Xcode 10.2 protocol inheritance issue
- 父类不再遵循 UITableView 相关代理,改由子类去遵循并实现
但愿以后 Apple 能少出一些直接影响到稳定性的 bug ......