MJRrefresh:關(guān)于mj_reloadData死循環(huán)崩潰分析

問題描述及分析



廢話不多說.直接上傳截圖了.在iOS11.0之前,MJRrefresh直接崩潰在mj_reloadData的死循環(huán)中.

那么問題出現(xiàn)在什么位置呢?其實(shí)就是 UITableView的estimatedRowHeight屬性和- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath方法,我們知道這兩個(gè)方法是估算高度的功能.假設(shè)你對(duì)其進(jìn)行了設(shè)置,而且值過小的時(shí)候,MJRefresh的KVO會(huì)監(jiān)聽錯(cuò)誤的contentoffset,造成不停進(jìn)行上拉加載操作.最終就造成了崩潰.


解決方案


網(wǎng)上現(xiàn)在提供了兩種方案.分別是注釋源碼和修改estimatedRowHeight的值.

  • 注釋MJRefresh中兩個(gè)方法.在UIScrollView+MJRefresh.m文件中的UITableView和UICollectionView的load方法.

但是這種方案會(huì)導(dǎo)致automaticllyHidden = YES失效.當(dāng)然了.在最新的版本中,MJRrefresh的作者已經(jīng)提到要棄用automaticllyHidden這個(gè)屬性了.所以仍然還在使用這個(gè)屬性的童鞋需要注意.

  • 把estimatedRowHeight的值或者- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath方法的返回值設(shè)置為和你的Cell高度相似即可.


estimatedRowHeight 設(shè)置分析 (方案優(yōu)化)


難道,解決mj_reloadData死循環(huán)崩潰到這里就結(jié)束了嗎?不不不,我們要分析下我們的當(dāng)初是什么情況下設(shè)置estimatedRowHeight屬性或是- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath這個(gè)代理方法的.設(shè)置estimatedRowHeight屬性是當(dāng)我們上拉加載的時(shí)候發(fā)現(xiàn)當(dāng)前的tableView出現(xiàn)抖動(dòng),原因就在于并沒有設(shè)置estimatedRowHeight屬性這個(gè)屬性造成了.

那么,是不是我們解決了tableView列表跳動(dòng)問題.我們就可以不使用estimatedRowHeight屬性呢?是的,經(jīng)過一番查證之后,發(fā)現(xiàn)網(wǎng)上有這種解決方案.即可全局解決抖動(dòng)問題.

    if (@available(iOS 11, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; //iOS11 解決SafeArea的問題,同時(shí)能解決pop時(shí)上級(jí)頁(yè)面scrollView抖動(dòng)的問題
    }else{
        [UITableView appearance].estimatedRowHeight = 0;
        [UITableView appearance].estimatedSectionHeaderHeight = 0;
        [UITableView appearance].estimatedSectionFooterHeight = 0;
    }

這樣,我們就可以不設(shè)置estimatedRowHeight屬性了.然后mj_reloadData死循環(huán)崩潰也就迎刃而解了.刪除estimatedRowHeight屬性或者或者- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath代理方法即可.


結(jié)語(yǔ)


出現(xiàn)問題 → 分析問題 → 解決問題 → 優(yōu)化解決方案 . 到這里就結(jié)束了.有任何問題歡迎評(píng)論區(qū)留言,一起探討.謝謝.歡迎關(guān)注騷棟.

崩潰源碼Demo傳送門


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容