问题:iOS8下,界面A使用了grouped类型的UITableView,发现点击cell跳转到别到界面,再返回界面A的时候,tableView的滚动位置发生了改变,即tableView.contentOffset.y发生了改变。
思考:tableView.contentOffset发生变化,查找发现自己没有手动设置tableView的contentOffset属性。那么一定是调用了scrollViewDidScroll代理方法,在scrollViewDidScroll下断点,发现点击cell的跳转的时候和返回的时候都调用了这个滚动的代理方法。一般tableView scrollViewDidScroll的调用是reloadData触发,在A界面断点[tableView reloadData],发现没有调用。
解答:debug了很多次,排除其他原因之后,仔细看代码发现使用了预估高度和自动计算高度的代码
tableView.estimatedRowHeight = 110;
tableView.rowHeight = UITableViewAutomaticDimension;
屏蔽这两句代码之后,果然成功解决。猜测是iOS8 使用预估高度和自动计算高度,每次tableView展示会自动去调用reloadData,所以改变了tableView.contentOffset。
总结:iOS9及之上没有这个bug。预估高度和自动计算高度在iOS8下慎重使用。