CocosUI之TableView

本文详细介绍了Cocos2d-x中TableView组件的使用方法,包括TableViewDataSource的数据源配置、Cell的创建与管理,以及如何添加触摸事件处理。通过实例代码展示了如何实现不同尺寸的Cell及响应触摸事件。

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中的nodeTableViewCell则相当于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

这个代理的其他虚函数可见源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值