当需要王者之剑那种地图关卡“翻页”功能时、当需要好友视图中的“列表”功能时恐怕都离不开CCTableView。
一开始看什么ViewDelegate、什么DataSource啊什么的,感觉真麻烦。
-------------------------------美丽的分割线-------------------------
主要实现步骤:
1、创建TableView
2、设置滑动方向
3、设置触摸代理和DataSource。 Ds提供的是Cell的数量、Cell的大小。
4、在触摸代理的tableCellAtIndex()函数中创建Cell。
bool TableViewTestLayer::init()
{
if ( !CCLayer::init() )
{
return false;
}
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCTableView* tableView = CCTableView::create(this, CCSizeMake(400, 400)); // 设置Source和大小
tableView->setDirection(kCCScrollViewDirectionHorizontal); // 设置滑动方向
tableView->setPosition(ccp(20,winSize.height/2-30));
tableView->setDelegate(this);
this->addChild(tableView); // 设置触摸代理。 其实就是设置一个对象,这个对象负责处理对TableView触摸的一些操作
tableView->reloadData();
CCTableView::create(this...
这里为何要传入this呢?
在这个地方就不要把this看成是TableViewTestLayer的这个布景层这个概念了,this传进去提供的是TableViewTestLayer类从CCTableViewDataSource类继承而来的函数:
virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx) {
return cellSizeForTable(table); // 获得一个单元格的Size大小
};
virtual CCSize cellSizeForTable(CCTableView *table) {
return CCSizeZero; // 返回大小(0,0) (cell可以当做一个有额外功能的CCNode,只用来放子显示对象,因此大小无所谓)
};
virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx) = 0; // 返回一个给定索引值的cell,一般情况下,都是在这下面创建cell。(当显示一个cell时,会调用这个,获得它并显示,因此这里创建)
virtual unsigned int numberOfCellsInTableView(CCTableView *table) = 0; // 这里和上面一个函数的“性质”一样,都是在运行时的回调函数,当要显示TableView时,当然先要知道有多少个cell(感觉不科学,但这个就是设置cell数量的地方)
接着看init()方法里面的代码:
tableView->setDelegate(this);
现在也能理解设置代理也是用“this”了!
tableView->reloadData(); //reloads data from data source. the view will be refreshed. 简单点说:cell们,都现身吧! ^ ^
完整的TableView创建过程已经结束了,下面看看它是在哪、如何创建一个个创建Cell:
CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
CCString *string = CCString::createWithFormat("%d", idx);
CCTableViewCell *cell = table->dequeueCell();
if (!cell) {
cell = new CustomTableViewCell(); // 只是重载了Draw()方法,在这个里面可以自定义Cell的显示
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;
}
触发这个函数的地方是CCTableView::insertCellAtIndex(unsigned int idx)
CCTableViewCell *cell = table->dequeueCell(); // 如果目前这个Cell存在,则不创建,否则创建并返回。
代码就不贴出来了,这个作用很简单。
最后,处理Cell被触摸的事件:
void TableViewTestLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
CCLOG("cell touched at index: %i", cell->getIdx());
}
-------------------------------美丽的分割线-------------------------
我不会告诉你,精华在这:
如果要嵌套TableView,直接在tableCellAtIndex里面实现不就完了么~
想怎么套,就怎么套~
-------------------------------美丽的分割线-------------------------
总结:
1、注意设置触摸代理和DataSource,这两个是TableView能否正常工作的关键。
2、不用担心Cell数量过大,Cell是动态创建的。(因为dequeueCell函数)
3、如果想,滑动一下就是整个Cell的宽度(翻页),需要重写relocateContainer()函数哦~