CCTableView刷新数据后显示错乱
有人建议将
if (m_pCellsFreed->count() == 0)改成
if (1) //m_pCellsFreed->count() == 0 即可解决问题
好像是很容易就解决问题了,但更改cocos2d的源码肯定是不合理而且会存在一些问题的
看一个论坛有人说: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;
- }
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 //这里处理的复用原来的面板
- {
- <strong> CCLabelTTF *label = (CCLabelTTF*)cell->getChildByTag(123);
- label->setString(string->getCString());</strong>
- }
- return cell;
- }
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());