现象:
tableView正常滑动,某个cell正常
出现在屏幕中,然后又突然消失
了(此时cell并未划出屏幕),然后等cell消失后的空白区域划出屏幕后,再次划回来,就没问题了,只有第一次加载会出现。
原因:
在cell加载的时候做了耗时
操作。
详细说明:
cellForRowAtIndexPath:
方法中,我们一般也会进行赋值
操作,如果在这个时候做了一些耗时的操作,就会导致cell消失的现象。
我的情况是,cell里边又添加了一个collectionView
,然后每个collectionView的cell有一个title,这个title后端传的是html格式的富文本
,需要先转成NSAttributeString
再进行赋值显示。
虽然以前也经常这么用,但以前基本上都是一两个label用html文本,所以没问题,这次是cell里边嵌套collection
,collection里边有7个cell,转化的次数增多了,耗时也增加了,就导致了这个问题。
之所以之后就显示正常了,是因为我在model
里增加了个xxxAttr
属性,懒加载attributeString,之后cell再次复用,不用重新生成了,所以就没问题了。错误示范:
-(NSAttributedString *)titleAttr{
if (!_titleAttr) {
NSMutableAttributedString *attrStr = [NSMutableAttributedString stringWithHTMLString:_title];
attrStr.yy_font = [UIFont pingFangMedium:15];
_titleAttr = attrStr;
}
return _titleAttr;
}
我这种情况的解决办法是,在请求的回调中,在JSON
转Model
之后,就直接生成这些属性字符串,这样问题就解决了。
顺便一说,如果你用的JSON转模型的第三方是MJExtension
的话,当字典转模型完毕时会调用mj_keyValuesDidFinishConvertingToObject
这个方法,所以上边的操作可以放到这里实现。示例如下:
- (void)mj_keyValuesDidFinishConvertingToObject{
NSMutableAttributedString *attrStr = [NSMutableAttributedString stringWithHTMLString:_title];
attrStr.yy_font = [UIFont pingFangMedium:15];
_titleAttr = attrStr;
}
当然,不排除其他地方的耗时操作也会导致这个问题。