#include "cocos-ext.h" using namespace cocos2d::extension; class TableViewTestLayer: public CCTableViewDataSource, public CCTableViewDelegate { public: /////////////////////////////////////////////////////////////////////////////////////////// // CCScrollViewDelegate virtual void scrollViewDidScroll(CCScrollView* view){} virtual void scrollViewDidZoom(CCScrollView* view){} // CCTableViewDelegate //点击响应 virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell){} //设置按下时高亮 virtual void tableCellHighlight(CCTableView* table, CCTableViewCell* cell){} //设置松开是取消高亮 virtual void tableCellUnhighlight(CCTableView* table, CCTableViewCell* cell){} //循环使用某个单元格 virtual void tableCellWillRecycle(CCTableView* table, CCTableViewCell* cell){} // CCTableViewDataSource //每一项的大小 virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx); //每一项的内容 virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx); //一共多少项 virtual unsigned int numberOfCellsInTableView(CCTableView *table); /////////////////////////////////////////////////////////////////////////////////////////// protected: CCTableView *mTableView; };
// mTableView = CCTableView::create(this, CCSizeMake(616, 551)); //设置左右滑动 或上下 mTableView->setDirection(kCCScrollViewDirectionVertical); // mTableView->setPosition(ccp(12, 851-770)); mTableView->setDelegate(this); //index0123...由上到下放置 mTableView->setVerticalFillOrder(kCCTableViewFillTopDown); mBg->addChild(mTableView); // CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx) { CCTableViewCell *pCell = table->dequeueCell(); if (! pCell ) { pCell = new CCTableViewCell(); pCell ->autorelease(); //添加该项内容、、、、 } else { //该项已有内容,服用之前滑出可视区域的tablecell,要么全部移除重新添加,要么自己更新、、、、 } }
值得注意的是:
1. tableView在setVerticalFillOrder时会reloadData;
void CCTableView::setVerticalFillOrder(CCTableViewVerticalFillOrder fillOrder) { if (m_eVordering != fillOrder) { m_eVordering = fillOrder; if (m_pCellsUsed->count() > 0) { this->reloadData(); } } }
所以--->要是在tableCellAtIndex中使用tableView的parent,记得先parent->addchild(tableveiw);再setVerticalFillOrder
2.tableView在create的时候,就会预加载一下tableCell,调用updateCellAtIndex,下面是调用CCTableView::create的调用堆栈
所以--->要是在updateCellAtIndex中涉及到tableView的parent调用,程序就会蹦掉、
所以最好将create出来的tableView保存为成员变量,然后在updateCellAtIndex中判断一下
CCTableViewCell *cell = table->dequeueCell(); if (cell == NULL) { cell = new CCTableViewCell(); cell->autorelease(); } else { cell->removeAllChildren(); } //如果不是create保存的成员变量(即此时调用的updateCellAtIndex是在create是预加载调用的),则不要涉及到parent的操作。 if (table != mTableView) return cell;