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