今天研究了一下CCTableView,这个东西是用来做列表的,就是我们经常看到的那些滑动选择物品,道具什么的功能,不明白的可以看看我的图哈。之前写过一篇博客是关于CCScrollView的,那个实现起来感觉也比较简单,今天的这个东西就是函数多了一些,好好的理一下思路的话也不难,东西还是多用,用熟练了就会了!CCTableView是从CCScrollView继承下来的,如图所示。

CCTableView的使用 CCTableView的使用

 

使用的时候分这么几步去做。CCTableView属于扩展库中的东西,所以要包含扩展库了,然后需要将使用的类继承自CCScrollViewDelegate和CCScrollViewDataSource这俩个接口,接下来就是覆写接口中的函数了。在不同的函数中,我们要写不同的实现功能。这个CCScrollView从道理上说是这样的,CCScrollView就是一个层,可以设置这个层的大小,这个层的位置,总之就是一个完成列表功能的对象。而每一个选择项都是一个cell,这个cell有它自己的大小,我们要把很多个这样的cell都放到CCScrollView这个层中。在每个cell中我们加入我们需要的东西,然后点击cell的时候会调用相应的函数。我喜欢在代码中加入注释说明,这样看的也比较清楚,那就上代码吧!

CCTableView的使用

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
using namespace cocos2d;

//使用CCTableView必须包含扩展库和命名空间
#include "cocos-ext.h"
USING_NS_CC_EXT;

//需要实现CCTabelViewDelegate和CCTabelViewDataSource这俩个接口
class HelloWorld : public cocos2d::CCLayer,public CCTableViewDelegate,public CCTableViewDataSource
{
public:
    virtual bool init();  

    static cocos2d::CCScene* scene();

    CREATE_FUNC(HelloWorld);

	//继承自以上的接口需要实现的方法如下
	//这个虚函数是从CCTableViewDelegate继承下来的,其他三个是从CCTableViewDataSource继承下来的
	void tableCellTouched(CCTableView * table,CCTableViewCell * cell);
	CCSize tableCellSizeForIndex(CCTableView * table,unsigned int index);
	CCTableViewCell * tableCellAtIndex(CCTableView * table,unsigned int index);
	unsigned int numberOfCellsInTableView(CCTableView * table);

	//以下俩个函数可以覆写,也可以不覆写,是从CCTableViewDelegate继承下来的
	void tableCellHighlight(CCTableView * table,CCTableViewCell * cell);
	void tableCellUnhighlight(CCTableView * table,CCTableViewCell * cell);

	//因为CCTableView继承自CCScrollView所以要实现这俩个方法,里边一般都不写东西
	void scrollViewDidScroll(CCScrollView *){};
	void scrollViewDidZoom(CCScrollView *){};
};

#endif
bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }

	CCSize size = CCDirector::sharedDirector()->getWinSize();

	/*
	创建一个竖直方向的tableview
	*/

	//初始化的时候第一个参数是CCTableViewDataSource,第二个参数代表tableview的大小
	CCTableView * table = CCTableView::create(this,CCSize(100,320));

	//设置delegate代理
	table->setDelegate(this);

	//设置tableview的滑动的方向
	//kCCScrollViewDirectionHorizontal 水平
    //kCCScrollViewDirectionVertical 竖直
	table->setDirection(kCCScrollViewDirectionVertical);

	//CCTableView默认是以左下角点设置坐标位置的,它继承自CCLayer,这一点不难理解
	table->setPosition(ccp(size.width/5,0));

	this->addChild(table);

	/*
	创建一个水平方向的tableview
	*/
	CCTableView * tableView = CCTableView::create(this,CCSize(size.width/2,50));
	tableView->setDelegate(this);
	tableView->setDirection( kCCScrollViewDirectionHorizontal);
	tableView->setPosition(ccp(size.width/2,size.height/2));
	this->addChild(tableView);
	//这句话一定要加上啊,意思是用现有的配置去刷新所有的cell
	tableView->reloadData();

    return true;
}

//这里设置cell被点击以后的回调函数
void HelloWorld::tableCellTouched(CCTableView * table,CCTableViewCell * cell)
{
	CCLog("%d:touched!",cell->getIdx()+1);
}

//这个函数是用来获得cell的
CCTableViewCell * HelloWorld::tableCellAtIndex(CCTableView * table,unsigned int index)
{
	CCString * string = CCString::createWithFormat("%d",index+1);

	//获得一个可用的cell,因为在我们滑动cell的时候有些cell是显示的,有些不是显示出来的,把没有渲染的cell拿过来
	//这样就不用重新new出一个cell了,这样的话可以减小内存的开销
	CCTableViewCell * cell = table->dequeueCell();
	if(!cell)
	{
		cell = new CCTableViewCell();
		cell->autorelease();

		//添加背景图片到cell中,便于区分边界
		CCSprite * background = CCSprite::create("cell.png");
		background->setAnchorPoint(ccp(0,0));
		background->setPosition(CCPointZero);
		cell->addChild(background,0);

		//添加文本信息到cell中
		CCLabelTTF * text = CCLabelTTF::create(string->getCString(),"",20);
		text->setPosition(ccp(25,25));
		text->setTag(1);
		text->setColor(ccc3(255,0,0));
		cell->addChild(text,1);

		//添加精灵到cell的中心位置
		CCSprite * sprite = CCSprite::create("icon.png");
		sprite->setPosition(ccp(50,25));
		cell->addChild(sprite,1);
	}
	//else中获得是没有渲染出来的cell,cell中原有的内容还存在
	else
	{
		//改变原来cell中的文本信息
		CCLabelTTF * text = (CCLabelTTF *)cell->getChildByTag(1);
		text->setString(string->getCString());
	}

	return cell;
}

//这里设置每个cell的大小
CCSize HelloWorld::tableCellSizeForIndex(CCTableView * table,unsigned int index)
{
	return CCSize(100,50);
}

//这里设置一共有多少个cell
unsigned int HelloWorld::numberOfCellsInTableView(CCTableView * table)
{
	return 20;
}

//如果某个cell被点击了,则会调用此函数
void HelloWorld::tableCellHighlight(CCTableView * table,CCTableViewCell * cell)
{
	CCLog("highlight!");
}

//点击之后会调用这个函数,观察这几个函数的调用顺序,发现highlight首先调用
//unhighlight然后调用,最后是tableCellTouched
void HelloWorld::tableCellUnhighlight(CCTableView * table,CCTableViewCell * cell)
{
	CCLog("unhighlight!");
}