現(xiàn)象:
tableView正?;瑒?,某個cell正常出現(xiàn)在屏幕中,然后又突然消失了(此時cell并未劃出屏幕),然后等cell消失后的空白區(qū)域劃出屏幕后,再次劃回來,就沒問題了,只有第一次加載會出現(xiàn)。
原因:
在cell加載的時候做了耗時操作。
詳細(xì)說明:
cellForRowAtIndexPath:方法中,我們一般也會進(jìn)行賦值操作,如果在這個時候做了一些耗時的操作,就會導(dǎo)致cell消失的現(xiàn)象。
我的情況是,cell里邊又添加了一個collectionView,然后每個collectionView的cell有一個title,這個title后端傳的是html格式的富文本,需要先轉(zhuǎn)成NSAttributeString再進(jìn)行賦值顯示。
雖然以前也經(jīng)常這么用,但以前基本上都是一兩個label用html文本,所以沒問題,這次是cell里邊嵌套collection,collection里邊有7個cell,轉(zhuǎn)化的次數(shù)增多了,耗時也增加了,就導(dǎo)致了這個問題。
之所以之后就顯示正常了,是因為我在model里增加了個xxxAttr屬性,懶加載attributeString,之后cell再次復(fù)用,不用重新生成了,所以就沒問題了。錯誤示范:
-(NSAttributedString *)titleAttr{
if (!_titleAttr) {
NSMutableAttributedString *attrStr = [NSMutableAttributedString stringWithHTMLString:_title];
attrStr.yy_font = [UIFont pingFangMedium:15];
_titleAttr = attrStr;
}
return _titleAttr;
}
我這種情況的解決辦法是,在請求的回調(diào)中,在JSON轉(zhuǎn)Model之后,就直接生成這些屬性字符串,這樣問題就解決了。
順便一說,如果你用的JSON轉(zhuǎn)模型的第三方是MJExtension的話,當(dāng)字典轉(zhuǎn)模型完畢時會調(diào)用mj_keyValuesDidFinishConvertingToObject這個方法,所以上邊的操作可以放到這里實現(xiàn)。示例如下:
- (void)mj_keyValuesDidFinishConvertingToObject{
NSMutableAttributedString *attrStr = [NSMutableAttributedString stringWithHTMLString:_title];
attrStr.yy_font = [UIFont pingFangMedium:15];
_titleAttr = attrStr;
}
當(dāng)然,不排除其他地方的耗時操作也會導(dǎo)致這個問題。