iOS:tableView重新整理閃爍問題解決
阿新 • • 發佈:2019-02-09
我做的是直播訊息系統,每當有人評論、送禮物、第一次點贊直播訊息列表都要及時顯示。就像這樣
原來思路是這樣的:圖中紅框是我們的訊息列表,是一個tableView,每個訊息是一個cell,每次接收到一條訊息立刻新增到資料陣列中,同時重新整理tableView,滾動到底部。 原來的程式碼是這樣寫的:
[chatDataArray addObject:chatModel]; [chatTable reloadData]; NSIndexPath *myIndexPath = [NSIndexPath indexPathForRow: chatDataArray.count - 1 inSection:0]; [chatTable selectRowAtIndexPath:myIndexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
但是這樣寫有一個很大的問題就是:每次接受到訊息時新增到資料陣列中,同時重新整理tableView的時候,整個tableView會閃爍一下,這個問題困擾我好久不知道怎麼解決,期間用過很多辦法(先隱藏再重新整理,非同步重新整理),踩了很多坑,都解決不了問題,分析閃爍的根源是因為重新整理的是整個tableView,想想如果只重新整理最後一行就好了,但是區域性重新整理的方法的前提是這行cell原來是存在的,但是這個直播訊息是每次有新訊息後有重新整理列表,一個新的訊息產生後伴隨著一個新的一行cell(其實是沒產生新的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