您的位置:首页 > 移动开发 > Cocos引擎

CocosUI之TableView

2016-04-16 14:46 357 查看

TableView(更好用的滑动窗口)

基本应用

TableView* tableView =
TableView::create(sou, Size(49*5,47)); addChild(tableView);

创建TableView的参数1是一个TableViewDataSource的对象,参数2则是显示窗口的大小。

同样,也有一堆属性设置:

tableView->setDirection(ScrollView::Direction::HORIZONTAL);
tableView->reloadData();
tableView->setPosition(winSize.width/ 2, winSize.height / 2);

注意的是:这个reloadData很重要,每逢信息变更想要显示,必须reload一下

TableViewDataSource:

1. 这个类是一个纯虚类

2. 必须重载2纯虚函数:tableCellAtIndex(回调函数)和numberOfCellInTableView(返回拥有的cell数目),当然还有2个可重载函数。这些虚函数本质上是设置函数,其return的值就是我们要动态设置的值。

3. 这样来理解:TableViewDataSource相当于ScrollView中的node,TableViewCell则相当于node中的精灵(其实Cell是存放精灵的),这个类将ScrollView进行了更良好的封装以便用。

4. Cell的大小

定义这个数据封装类:

class
MyTableViewDataSouce : public
TableViewDataSource
{
public:
Vector<TableViewCell*> _cells; //用Vector来做存放TableViewCell的容器
// Size winSize =Director::getInstance()->getWinSize();
Size itemSize =
Size(49, 47); //这个size是tableCell的大小
MyTableViewDataSouce()
{
for (int i = 0; i < 11;i++)
{
TableViewCell* cell =
TableViewCell::create();cell中不能直接放入图片,只是一个继承自Node的类,必须add精灵
_cells.pushBack(cell);
Sprite* sprite =
Sprite::create("Images/r1.png");
cell->addChild(sprite);

sprite->setPosition(itemSize.width/ 2, itemSize.height / 2);
}
}
/*这个函数设置cell的大小,参数1是调用这个函数的TableView,参数2是一个序号即cell的序号 */
非必须重载virtual
SizetableCellSizeForIndex(TableView *table,
ssize_t idx) {
#if 0
if (idx == 3)
{
return Size(itemSize.width* 2, itemSize.height);
}
#endif
return cellSizeForTable(table);
};
非必须重载virtual
Size cellSizeForTable(TableView *table) {
// return winSize;
return itemSize;
}
/* 返回idx指定的那个Cell */
必须重载virtual
TableViewCell* tableCellAtIndex(TableView *table,
ssize_t idx)
{
return _cells.at(idx);
}
/*返回有几个cells*/
必须重载virtual
ssize_tnumberOfCellsInTableView(TableView *table)
{
return _cells.size();
}
};

使用:考虑不愿意delete,只能用局部变量

MyTableViewDataSouce _source;

MyTableViewDataSouce* sou =&_source;

然后将这个对象放入TableView就可以了。

总结:TableView就是对ScrollView封装,将数据维护交给了TableViewDataSource,同样的我们也可以在其中做触摸处理,这一点和ScrollView是一样的。

但很重要的一点是:TableViewDataSource中的虚函数其实都是设置函数,如这一段函数用处是当idx为3时设置2倍宽度的Cell(注意是Cell,不是Cell中的精灵,但是通常我们把Cell和精灵设为一样大的)

virtual
SizetableCellSizeForIndex(TableView *table,
ssize_t idx)

{
if (idx == 3)
{
return Size(itemSize.width* 2, itemSize.height);
}
return cellSizeForTable(table);
}

添加触摸

TableView的触摸是通过TableViewDelegate做到的

1. 创建某个继承自TableViewDelegate类的类,或者让调用这个TableView的类(通常是Layer子类)继承这个类,第二种方式更易于做些操作。

2. 重载回调纯虚函数tableCellTouched:两个参数,一个是被点的table一个是被点的cell

virtual
void tableCellTouched(TableView*
table, TableViewCell*
cell)
{ //这个回调完成删除被点击的Cell
int idx =
cell->getIdx();

_source._cells.eraseObject(cell);
table->reloadData();//每次做出数据变更总应该reload一下
CCLOG("idx=%d", idx);
}

3. 为需要的TableView添加代理对象(即继承的这个类对象)

tableView->setDelegate(this);

ScrollView也有代理,但是这个代理只有2个虚函数

TableViewDelegate 继承自ScrollViewDelegate

这个代理的其他虚函数可见源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: