Cocos2d-x 2.x:CCTableView的使用

首先我们为何要使用TableView?Table is a view!什么?桌子是视图?哈~Table == 表格。当需要王者之剑那种地图关卡“翻页”功能时、当需要好友视图中的“列表”功能时恐怕都离不开CCTableView。一开始看什么ViewDelegate、什么DataSource啊什么的,感觉真麻烦。但今天花了点时间仔细看了看代码,其实就那么一回事啊,so
摘要由CSDN通过智能技术生成


当需要王者之剑那种地图关卡“翻页”功能时、当需要好友视图中的“列表”功能时恐怕都离不开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();

在TestCpp中,代码如上。看起来使用很简单,Create加相关设置就好了,其实不然。
 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()函数哦~




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值