最近改一个用UITableView显示微聊消息,但是消息无法滚动到最底部,然后来了新的消息也无法自动滚动到最新的消息处(即最底部),我自己曾经写过滚动到最底部的代码,但是那个时候用的是[self.tableViewChart scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];,前提是知道所有的消息,然后滚动到最底部,但是这个项目是其他同事写的,我维护的时候发现跟我以前的逻辑不一样,无法使用scrollToRowAtIndexPath,因为当然的消息array不是包含所有的消息,所以即使取array的最后一个也不是tableview显示的最后一个.
查了很多资料,都说[self.tableView setContentOffset:CGPointMake(0, self.tableView.contentSize.height -self.tableView.bounds.size.height) animated:YES];和[self.tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];可以滚动到最底部,当时我用的是第二种,确实可以达到目的,但是有一个不好的地方,就是如果array不变,那么再次调用这个代码,所有的消息都会被顶到看不见(当数据源不变,再次调用[self.tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)]的时候会发现所有的消息都被顶到最最上面去了)所以这种方法是不可取的,因为不可以随便刷新
[self.tableView setContentOffset:CGPointMake(0, self.tableView.contentSize.height -self.tableView.bounds.size.height) animated:YES]这个方法理论上是可以的,但是在我维护的项目中一直不信,总是滚动不到最下面,后来想了很多办法,但是一直没有抓住问题的本质,因为以前的开发者有一个滚动到最下面的函数,所以我的关注点都在这个函数里面(我相信她调用这个函数的时机是对的,结果最后发现是调用时机的问题),结果一直在折腾这个函数里面的代码是不是错误,最后黔驴技穷,只能透过问题找本质,结果发现是调用时机的问题,代码里面在ViewDidLoad里面有一个监听,只要来了新的微聊消息就会触发,在这个里面刷新tableview,然后调用[self.tableView setContentOffset:CGPointMake(0, self.tableView.contentSize.height -self.tableView.bounds.size.height)方法即可解决问题,记住,是先[tableview relsoaddata],然后再调用,这样就OK了
通过这个问题,也提醒了我们,如果说大家都说的方法不行,那么就想想是不是这个方法本身的调用时机或者调用的地方有问题,与大家共勉