萬(wàn)萬(wàn)沒想到原因居然是 Xcode10.2.1 的 bug
?前言:在這次App版本迭代進(jìn)入集成測(cè)試階段尾聲澜薄,正式環(huán)境打包release環(huán)境后,測(cè)試回歸發(fā)現(xiàn)許多包含 tableView 的頁(yè)面都無(wú)法響應(yīng)點(diǎn)擊事件。但是在 debug 環(huán)境下從開發(fā)功能到滾動(dòng)測(cè)試流程,一直都是沒問題的陨仅。開始時(shí),真的是百思不得其解
開發(fā)環(huán)境:
Xcode10.2.1 swift 5.0
涉及的類關(guān)系:
父類:BaseTableViewController 擁有成員變量 UITableView
子類:SubTableViewController 繼承自 BaseTableViewController
父類遵循 UITableViewDelegate 與 UITableViewDataSource 代理铝侵,由子類 SubTableViewController 覆寫實(shí)現(xiàn)具體的代理方法灼伤。
問題癥結(jié):
- debug 模式下真機(jī)與模擬器調(diào)試,遵循的代理方法都可以正常執(zhí)行咪鲜;
- release 模式打包出來(lái)后狐赡,子類中覆寫的 TableView 相關(guān)協(xié)議
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
與func numberOfSections(in tableView: UITableView)
方法無(wú)法正常執(zhí)行,導(dǎo)致頁(yè)面顯示錯(cuò)誤與點(diǎn)擊事件無(wú)響應(yīng)疟丙;
問題原因:
Xcode 10.2 版本打包編譯 bug颖侄。在查閱了大量的資料后,最終得出了這個(gè)怎么也沒想到的結(jié)果享郊。
從官方論壇的 bug 反饋中览祖,找到了證據(jù):Inference of @objc from witnessed protocol requirement fails sometimes
解決方案:
- 使用 Xcode 10.1 打包上線(若使用 swift 5 版本,此方案無(wú)效)炊琉;xcode 10.2.1 swift UITableView部分協(xié)議方法不執(zhí)行
- 在子類中要覆寫代理實(shí)現(xiàn)的方法前展蒂,添加 @objc ;Xcode 10.2 protocol inheritance issue
- 父類不再遵循 UITableView 相關(guān)代理,改由子類去遵循并實(shí)現(xiàn)
后續(xù)更新
Apple官方聲明該 bug 在 swift 5.1中已被修復(fù)swift bug反饋鏈接