也爆一个CCTableView的bug

现象:

tableview创建10个cell之后(cell中只是简单的标示数字),

然后不做任何滑动,只是点击一次按钮,删除一个cell,每个cell的idx直接从m_pIndices获取,
比如m_pIndices 中数字分别是0-9,我会按照0-9的idx依次删除每个cell,结果发现删除到一半的时候idx=6,就再也无法删除cell了

好苦啊

查看了源码:发现应该是个bug,

CCTableView中删除的代码如下:
//remove first
this->_moveCellOutOfSight(cell);

m_pIndices->erase(idx);//这里是删除已使用的cell的idx,问题就出在这里
// ;
//这里的代码是删除上面的cell之后,对其他的每个使用中的cell的idx做个减少,
//但是这里并没有针对该cell对应的m_pIndices中的索引做同步修改,
//这就导致删除m_pIndices中idx为6的cell时,m_pCellsUsed中已经找不到了(因为idx被调整了)
for (unsigned int i=m_pCellsUsed->count()-1; i > newIdx; i–) {
cell = (CCTableViewCell*)m_pCellsUsed->objectAtIndex(i);
this->_setIndexForCell(cell->getIdx()-1, cell);
}

建议: 在 setIndexForCell的时候,在这里面同步一下m_pIndices中该cell此时的idx

mark — 虽然还没有遇到这个问题

试了一下,如下解决应该就可以了

void CCTableView::_setIndexForCell(unsigned int index, CCTableViewCell *cell)
{
cell->setAnchorPoint(ccp(0.0f, 0.0f));
cell->setPosition(this->_offsetFromIndex(index));
int formerIdx = cell->getIdx();//
int nowIdx = index;//
cell->setIdx(index);
std::set::iterator it = m_pIndices->find(formerIdx);//
if(it != m_pIndices->end()){//
m_pIndices->erase(formerIdx);//
m_pIndices->insert(nowIdx);//
}//
}
加了"//"的表示新添加的代码

mark — 虽然还没有遇到这个问题

mark 同上。

这个patch 还有缺陷,