看一个论坛有人说:tableview里面有行代码有逻辑错误,会引起不少bug 诸如你的bug 还有cell多了之后会出现顺序错乱甚至不出现,改了之后应该就好了
我们看CCTableViewCell .cpp文件中的CCTableViewCell *CCTableView::dequeueCell()函数中把
CCTableViewCell *CCTableView::dequeueCell()
{
CCTableViewCell *cell;
if (m_pCellsFreed->count() == 0) {
cell = NULL;
} else {
cell = (CCTableViewCell*)m_pCellsFreed->objectAtIndex(0);
cell->retain();
m_pCellsFreed->removeObjectAtIndex(0);
cell->autorelease();
}
return cell;
}
有人建议将
if (m_pCellsFreed->count() == 0)改成
if (1) //m_pCellsFreed->count() == 0 即可解决问题
好像是很容易就解决问题了,但更改cocos2d的源码肯定是不合理而且会存在一些问题的
cocos2d-x认为你的控件必然复用,所以如果每次刷新都要分创建和修改两种方式处理。看一下带得例子
CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string = CCString::createWithFormat("%d", idx);
CCTableViewCell *cell = table->dequeueCell();
if (!cell) { //这里处理的新建面板,但没有可复用的和第一次时处理
cell = new CustomTableViewCell();
cell->autorelease();
CCSprite *sprite = CCSprite::create("Images/Icon.png");
sprite->setAnchorPoint(CCPointZero);
sprite->setPosition(ccp(0, 0));
cell->addChild(sprite);
CCLabelTTF *label = CCLabelTTF::create(string->getCString(), "Helvetica", 20.0);
label->setPosition(CCPointZero);
label->setAnchorPoint(CCPointZero);
label->setTag(123);
cell->addChild(label);
}
else //这里处理的复用原来的面板
{
CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
label->setString(string->getCString());
}
return cell;
}
问题二:
用contentView->reloadData();刷新视图数据后,如果CCScrollView停留在最低端,可以调用下面一句回到顶端。
contentView->setContentOffset(contentView->minContainerOffset());