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;
}