我做的是直播消息系統(tǒng),每當有人評論、送禮物、第一次點贊直播消息列表都要及時顯示。就像這樣
消息系統(tǒng)效果
原來思路是這樣的:圖中紅框是我們的消息列表,是一個tableView,每個消息是一個cell,每次接收到一條消息立刻添加到數(shù)據(jù)數(shù)組中,同時刷新tableView,滾動到底部。
原來的代碼是這樣寫的:
[chatDataArray addObject:chatModel];
[chatTable reloadData];
NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow: chatDataArray.count - 1 inSection:0];
[chatTable selectRowAtIndexPath:myIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
但是這樣寫有一個很大的問題就是:每次接受到消息時添加到數(shù)據(jù)數(shù)組中,同時刷新tableView的時候,整個tableView會閃爍一下,這個問題困擾我好久不知道怎么解決,期間用過很多辦法(先隱藏再刷新,異步刷新),踩了很多坑,都解決不了問題,分析閃爍的根源是因為刷新的是整個tableView,想想如果只刷新最后一行就好了,但是局部刷新的方法的前提是這行cell原來是存在的,但是這個直播消息是每次有新消息后有刷新列表,一個新的消息產(chǎn)生后伴隨著一個新的一行cell(其實是沒產(chǎn)生新的cell,有復用機制,這里打個比方,不要誤解)。今天不知道怎么開光了,突然想到tableView還有一個insert的方法,一直不怎么用竟然把她忘了。
解決后的代碼如下:
[chatDataArray addObject:chatModel];
NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow: chatDataArray.count - 1 inSection:0];
[chatTable insertRowAtIndexPath:myIndexPath withRowAnimation:UITableViewRowAnimationNone];
[chatTable selectRowAtIndexPath:myIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
新的接受的消息cell直接插入到最后一行,然后再自動滾動到底部。不閃了,哈哈,so easy!完美解決!請記住整個偉大的方法
- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
希望這篇文章可以幫到你O(∩_∩)O