首页 > 关于 tableView 返回 cell 的问题

关于 tableView 返回 cell 的问题

objc    if(indexPath.row == self.items.count-1)
    {
      cell = [tableView dequeueReusableCellWithIdentifier:QuestionCellIdentifier  forIndexPath:indexPath];
    }
    else
    {
      cell = [tableView dequeueReusableCellWithIdentifier:CommentCellIdentifier forIndexPath:indexPath];
    }
    return cell;

objc      cell = [tableView dequeueReusableCellWithIdentifier:CommentCellIdentifier forIndexPath:indexPath];

    if(indexPath.row == self.items.count-1)
    {
      cell = [tableView dequeueReusableCellWithIdentifier:QuestionCellIdentifier forIndexPath:indexPath];
    }
    return cell;

我认为这两种写法结果上应该没有区别,但在我的项目中,返回的结果却是不同的,第一种写法,返回了正确的结果,第二种写法,进入了判断语句中,然后返回了QuestionCell,但是在显示上,却显示的是CommentCell,然后点击,又刷新成了QuestionCell,我确认是在主线程中执行的。

请问为什么会是这种结果?我猜测是dequeueReusableCellWithIdentifier:indexPath中进行了预加载,是这样么?


问题可能隐藏在cell = [tableView dequeueReusableCellWithIdentifier:CommentCellIdentifier forIndexPath:indexPath];与index.row和self.items.count的调用顺序,因为你调用的时候不能保证它们只是单纯返回值,而没有进行某些修改操作。
可以试试在方法开头先把index.row和self.items.count赋值给局部变量。


~~当然有区别了,怎么会没有区别呢?~~

~~简单的逻辑:~~

if(condition){
    a();
} else {
    b();
}
b();
if(condition) {
    a();
}

~~上面代码中,a()b()两者互斥,存在于if/else中,但下面那个b()是一定执行的,也就是说当condition条件满足时,a()b()都执行,和上面的代码块明显有差别的。~~

~~基于和 @MexiQQ 的讨论,再次审题,的确我这边之前弄错了作者的意图。~~


更新:

按照楼主的想法,我做了个测试,确实发现有这个问题。更深层次的原因,可以肯定的是和苹果的dequeueReusableCellWithIdentifier:forIndexPath:整个重用机制有关系。为什么这么说呢?

注意看下我在xcode下的UI Debug截图

图1:TableView正面角度图,插图描述有误,CommentCell的 label 为"Comment cell %ld", (long)row

图2:
期待视图效果:5个CommentCell(红色)在上,1个QuestionCell(蓝色)在下。
实际视图效果:6个CommentCell(红色)

图3:换个角度看看,发现第6行视图有些蹊跷

图4:字体弄成了黑色,并去掉了边框显示方便看的更清楚点

分析

在最后一个也就是测试数据的第六项,应该是QuestionCell, 按照第二种写法,先重用了CommentCell(红色), 紧接着判断是最后一个,将cell的指针指向了根据QuestionCellIdentifier进行重用的QuestionCell(蓝色)。最后视图却不是我们想要的样子,就像图中所示,红色覆盖在了蓝色上面,而不是想象中的蓝色替代掉红色。

更进一步讨论,期待回复或者追加回答。

【热门文章】
【热门文章】