iOS 12.2, Xcode10.2,Swift 5.0编译器
一、最近新上架一款App,系统为iOS12.2,Xcode版本额10.2,Swift5.0编译器。使用和之前App相同的框架,发现重大BUG。
(1)正常的场景:当你像我一样使用Swift 4.2版本,封装了基类BaseTableViewController,在基类中创建TableView,并设置dataSourse = self ,delegate = self时。你可能会在基类中实现需要的数据源或者代理方法。比如:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 10
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return 10
} else {
return 0.0001
}
}
这些方法你实现后,在后续继承与BaseTableViewController的类中,你需要使用重写该方法实现,这时不会出现问题。如下:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return (90 * SCREENWIDTH / 375)
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
(2)出现问题的场景:
此时如果你在BaseTableViewController中没有实现的didSelectRow代理方法,而在子类中也就不需要 override关键字,直接调用该代理方法,如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
此时会出现这个代理方法不会被调用的问题,无论你怎样操作,该代理方法都不会出触发。并且,这种情况可能在dev模式下不会出现问题,但是在你使用Xcode 10.2进行打包之后,比如hoc包,安装到真机上就会出现问题,这时你很难找到是什么导致这个代理方法不被触发的。
另外,如果你在dev模式安装测试之前,使用comman + shift + K 和 comman + shift + K + option 进行xcode清理,也可能会导致这个问题必先,如果不清理,可能该BUG不是必现的。个人猜测是因为缓存问题或者编译不一定使用的都是swift5.0编译器。
二、处理方法
处理方法,你在基类BaseTableViewController中,直接实现这个didSelectRow代理方法,那么在子类中使用override关键字进行重写,就能解决这个BUG。
或者你不在基类中调用,在子类中调用时候在该方法前增加@objc关键字,也能解决这个BUG。
子类中
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
或
@objc func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
二、多方查阅文档,最后在官方BUG网站https://bugs.swift.org中发现,此问题是Swift 5.0 编译器的BUG,官方将在之后版本修复。暂时解决方法如上所述。
该BUG官方链接:https://bugs.swift.org/browse/SR-10257。希望能帮到各位小伙伴。
其他BUG目前正在查找中,欢迎分享交流。