TableView控件
TableView控件:表框控件,TableView控件可以提供一个列表,列表是由多个单元组成,这些单元称为Cell,成水平或垂直方向对齐。每个单元中可以放置任意类型的对象,比如:字体标签,精灵图片,按钮等等。
使用:
注:本例结合Extension\TableViewTest子项目。
生成一个空的TableView,指定其工作的方向是水平还是垂直方向,然后设定位置。
CCTableView* tableView = CCTableView::create(this,CCSizeMake(250,60)); tableView->setDirection(kCCScrollViewDirectionHorizontal); tableView->setPosition(ccp(20,winSize.height/2-30));第一个参数类型是 CCTableViewDataSource,它是 CCTableView控件的数据源类,这个数据源类会提供三个方法,用于控制单元的数量和大小,提供数据单元的内容。
● CCSize cellSizeForTable(CCTableView *table):确定每个单元的大小范围。
● unsigned int numberOfCellsInTableView(CCTableView *table):确定列表一共有多少个
Cell单元。
片段:
CCSize TableViewTestLayer::tableCellSizeForIndex(CCTableView *table,unsigned int idx) { if (idx == 2) { return CCSizeMake(100,100); } return CCSizeMake(60,60); } CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table,unsigned int idx) { CCString *string = CCString::createWithFormat("%d",idx); CCTableViewCell *cell = table->dequeueCell(); if (!cell) { cell = new CustomTableViewCell(); 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; } unsigned int TableViewTestLayer::numberOfCellsInTableView(CCTableView *table) { return 20; }
用于展示
CCTableView控件的当前类
TableViewTestLayer定义时继承于
CCTableViewDataSource,,所以当前类中会定义并实现以上三个函数的具体内容。通过实现
CCTableViewDataSource类的三个函数,列表中的每个
Cell的大小被确定为60*60像素大小;列表中一共有20个
Cell;每个
Cell提供的内容是一个图片精灵和当前
Cell的编号
ID。
片段:
void TableViewTestLayer::tableCellTouched(CCTableView* table,CCTableViewCell* cell) { CCLOG("cell touched at index: %i",cell->getIdx()); }
在生成好的
CCTableView对象之后,还要指定它的委托对象,委托对象就是一个能够帮
CCTableView控件处理事件的对象,这个对象必须是
CCTableViewDelegate类型或者是其子
CCTableViewDelegate的子类,在
TableViewTest实例项目中,我们将当前类
CCTableViewTestLayer同时也定义成了
CCTableViewDelegate的子类,让其定义并实现处理
CCTableView控件的
tableCellTouched(CCTableView* table,CCTableViewCell* cell)回调函数,这个函数会在某个
Cell被点击后被调用,这里可以实现某个
Cell被选中后的处理过程,比如:一个玩家成绩列表,当某个成绩所在的
Cell被选中时,可以详细显示本次成绩的具体时间、分数等内容。
tableView->setDelegate(this); this->addChild(tableView); tableView->reloadData();为CCTableView设置委托对象,然后添加到场景。
效果:
重要的两个函数:
CCTableViewCell* tableCellAtIndex(CCTableView *table,unsigned int idx):函数在第一次初始化列表控件时会被每个Cell单元调用一次,以至于每个Cell单元都会被填充好内容,当列表在使用过程中,比如拖拽列表,导致列表中之前没有显示的Cell会被显示出来,对应的Cell单元回调用此函数,这时可以根据当前单元的索引ID,更新其要显示的内容。
CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table,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; }
void tableCellTouched(CCTableView* table,CCTableViewCell* cell):当
Cell单元被点击时调用的回调函数,函数第二个参数是
CCTableViewCell,也就是被点击到的Cell单元对象,在函数中我们可以获得
Cell单元的索引
ID,这样我们就可以知道当前是第几个
Cell单元被击中,并作出相应处理。
void TableViewTestLayer::tableCellTouched(CCTableView* table,cell->getIdx()); }