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
(蓝色)。最后视图却不是我们想要的样子,就像图中所示,红色覆盖在了蓝色上面,而不是想象中的蓝色替代掉红色。
更进一步讨论,期待回复或者追加回答。