CCTableView的使用和注意事项

#include "cocos-ext.h"
using namespace cocos2d::extension;

class TableViewTestLayer: public CCTableViewDataSource, public CCTableViewDelegate
{
public:
	///////////////////////////////////////////////////////////////////////////////////////////
	// CCScrollViewDelegate
	virtual void scrollViewDidScroll(CCScrollView* view){}
	virtual void scrollViewDidZoom(CCScrollView* view){}
	// CCTableViewDelegate
	//点击响应
	virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell){}
	//设置按下时高亮
	virtual void tableCellHighlight(CCTableView* table, CCTableViewCell* cell){}
	//设置松开是取消高亮
	virtual void tableCellUnhighlight(CCTableView* table, CCTableViewCell* cell){}
	//循环使用某个单元格
	virtual void tableCellWillRecycle(CCTableView* table, CCTableViewCell* cell){}
	// CCTableViewDataSource
	//每一项的大小
	virtual CCSize tableCellSizeForIndex(CCTableView *table, unsigned int idx);
	//每一项的内容
	virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx);
	//一共多少项
	virtual unsigned int numberOfCellsInTableView(CCTableView *table);
	///////////////////////////////////////////////////////////////////////////////////////////

protected:
	CCTableView *mTableView;
};

  

//
mTableView = CCTableView::create(this, CCSizeMake(616, 551));
//设置左右滑动 或上下
mTableView->setDirection(kCCScrollViewDirectionVertical);
//
mTableView->setPosition(ccp(12, 851-770));
mTableView->setDelegate(this);
//index0123...由上到下放置
mTableView->setVerticalFillOrder(kCCTableViewFillTopDown);
mBg->addChild(mTableView);




//
CCTableViewCell* TableViewTestLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)  
{  
    CCTableViewCell *pCell = table->dequeueCell();  
    if (! pCell ) 
    {  
        pCell = new CCTableViewCell();  
        pCell ->autorelease();  

        //添加该项内容、、、、
    }
    else
    {
        //该项已有内容,服用之前滑出可视区域的tablecell,要么全部移除重新添加,要么自己更新、、、、
    }
}
          
 

  

值得注意的是:

1. tableView在setVerticalFillOrder时会reloadData;

void CCTableView::setVerticalFillOrder(CCTableViewVerticalFillOrder fillOrder)
{
    if (m_eVordering != fillOrder) {
        m_eVordering = fillOrder;
        if (m_pCellsUsed->count() > 0) {
            this->reloadData();
        }
    }
}

所以--->要是在tableCellAtIndex中使用tableView的parent,记得先parent->addchild(tableveiw);再setVerticalFillOrder

 

2.tableView在create的时候,就会预加载一下tableCell,调用updateCellAtIndex,下面是调用CCTableView::create的调用堆栈

所以--->要是在updateCellAtIndex中涉及到tableView的parent调用,程序就会蹦掉、

所以最好将create出来的tableView保存为成员变量,然后在updateCellAtIndex中判断一下

	CCTableViewCell *cell = table->dequeueCell();

	if (cell == NULL)
	{
		cell = new CCTableViewCell();
		cell->autorelease();
	}
	else
	{
		cell->removeAllChildren();
	}

        //如果不是create保存的成员变量(即此时调用的updateCellAtIndex是在create是预加载调用的),则不要涉及到parent的操作。
	if (table != mTableView) return cell;

  

 

 

 

 

 

posted @ 2014-01-17 15:05  、拂晓  阅读(1552)  评论(0编辑  收藏  举报