CCTableView类的使用

CCTableView

CCScrollView类的子类,拥有相同的作用,滚动视图,但CCTableView这个类却用了两个代理来实现,一个代理(CCTableViewDataSource)负责数据源的管理,即管理显示的对象;另外一个代理(CCTableViewDelegate)则管理触摸事件,判断是点击了哪个对象。

staticCCTableView* create(CCTableViewDataSource* dataSource,CCSize size); //通过数据源来创建视图对象

voidreloadData(); //从数据源重新导入数据,达到刷新视图的目的,让改变滚动方向时需调用该函数。

CCTableView的使用:由于它所需的两个代理都为抽象类,那么必须实现里面的纯虚函数,最简单的办法是创建一个类,同时继承这两个抽象类,实现里面所有的纯虚函数,并根据实际情况重写一些需要的函数,然后创建CCTableView对象,将该类作为数据源传入即可!

CCTableViewCell

记录了视图对象数据的每个对象的相关信息

unsignedint getIdx();

CCTableViewDataSource

抽象类,管理视图对象的数据源,

virtualCCSize tableCellSizeForIndex(CCTableView *table,unsigned int idx)

//获取指定索引的数据对象的大小,可根据实际情况重写该函数

virtualCCSize cellSizeForTable(CCTableView *table) //获取数据对象的大小,默认返回0,需重写

virtualCCTableViewCell* tableCellAtIndex(CCTableView *table,unsigned int idx) = 0;

//返回指定索引的数据对象

virtualunsigned int numberOfCellsInTableView(CCTableView *table) = 0;

//返回数据对象的个数

CCTableViewDelegate

抽象类,管理视图对象的触摸事件等

virtual voidtableCellTouched(CCTableView* table,CCTableViewCell* cell) = 0;

//其中的一个数据对象(一个单元格)被点击,系统会调用这个函数,cell为被点击的对象的指针

使用例子如下:

//Layer1.h
#ifndef __Layer_H_H_H__
#define __Layer_H_H_H__

#include "cocos2d.h"
#include "cocos-ext.h"

USING_NS_CC;
USING_NS_CC_EXT;

class TableView : public CCTableViewDelegate,public CCTableViewDataSource
{
public:
	//触摸事件托管
	virtual void tableCellTouched(CCTableView* table,CCTableViewCell* cell)
	{
		//touch cell
		CCLog("touch cell index : %d",cell->getIdx());
	}

	virtual void tableCellHighlight(CCTableView* table,CCTableViewCell* cell)
	{
		CCLog("tableCellHightlight %d",cell->getIdx());
	}

	virtual void tableCellUnhighlight(CCTableView* table,CCTableViewCell* cell)
	{
		CCLog("tableCellUnhighlight %d",cell->getIdx());
	}

	virtual void tableCellWillRecycle(CCTableView* table,CCTableViewCell* cell)
	{
		CCLog("tableCellWillRecycle %d",cell->getIdx());
	}

	//CCScrollViewDelegate的两个纯虚函数  为CCTableViewDelegate的父类
	virtual void scrollViewDidScroll(CCScrollView* view){}
	virtual void scrollViewDidZoom(CCScrollView* view){}

	//数据源托管
	CCArray * m_cells;	//保存单元格

	TableView(){ m_cells = nullptr; }			//自己管理内存
	~TableView(){ if (m_cells)m_cells->release(); }

	static TableView* createWithArray(CCArray * cells)	//返回的对象需要自己释放
	{
		TableView * pView = new TableView;
		pView->m_cells = cells;
		pView->m_cells->retain();
		return pView;
	}

	//为用该函数,不需重写
	//virtual CCSize tableCellSizeForIndex(CCTableView *table,unsigned int idx) {
	//	return cellSizeForTable(table);
	//};
	
	//自己根据数据对象cell的大小返回相应的大小,通常是显示图片的大小
	//当然也可以设置大点,可以保证图片之间留出间隔
	virtual CCSize cellSizeForTable(CCTableView *table) {
		//return CCSizeZero;		//默认返回的大小为0
		return CCSize(70,50);		
	};

	//返回对应索引的数据对象(单元格)
	virtual CCTableViewCell* tableCellAtIndex(CCTableView *table,unsigned int idx)
	{
		return (CCTableViewCell*)m_cells->objectAtIndex(idx);
	}
	//返回数据对象(单元格)的个数
	virtual unsigned int numberOfCellsInTableView(CCTableView *table)
	{
		return m_cells->count();
	}
};

//layer层中使用CCTableView对象
class Layer1 : public CCLayer
{
public:
	bool init();

	static CCScene * scene();
	CREATE_FUNC(Layer1);


	void onExit();

	CCArray * cells;		//临时存放数据对象
	TableView * pViewData;		//数据源
};

#endif

//Layer1.cpp
#include "Layer1.h"
#include <cstdlib>

bool Layer1::init()
{
	if (!CCLayer::init())
		return false;
	//创建数据对象数组
	cells = CCArray::create();
	cells->retain();

	for (int i = 0; i < 5; i++)
	{
		char buffer[128] = { 0 };
		sprintf(buffer,"%d.png",i + 1);
		CCSprite * pSprite = CCSprite::create(buffer);	//通过本地文件来创建精灵
		pSprite->setAnchorPoint(ccp(0,0));
		//创建数据对象
		CCTableViewCell * cell = new CCTableViewCell;	//该类没有对应的工厂方法,需要new
		cell->addChild(pSprite);						//添加到数据对象(单元格)中
		cells->addObject(cell);							//添加到数组中
	}
	//创建数据源代理及触摸事件代理
	pViewData = TableView::createWithArray(cells);		//内部没有autorelease,需要手动释放
	CCTableView * pTableView = CCTableView::create(pViewData,CCSize(200,300));
	pTableView->setPosition(ccp(200,200));
	pTableView->setDirection(kCCScrollViewDirectionHorizontal);
	pTableView->reloadData();				//设置完滚动方向后需要重新导入数据
	//设置触摸事件代理
	pTableView->setDelegate(pViewData);		
	addChild(pTableView);

	return true;
}

void Layer1::onExit()
{
	CCLayer::onExit();
	//释放内存空间
	cells->removeAllObjects();
	cells->release();
	delete pViewData;		//需要手动释放
}

CCScene * Layer1::scene()
{
	CCScene * pScene = CCScene::create();
	Layer1 * pLayer = Layer1::create();
	if (pScene && pLayer)
		pScene->addChild(pLayer);
	else
	{
		delete pScene;
		pScene = nullptr;
		delete pLayer;
	}
	return pScene;
}

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...