首先又是个让我想不通的问题,也是很让我郁闷的,写了几个小东西后,遇上的困难依然没有减少,反而觉得遇到的越来越麻烦,
难道我真要把引擎的源码好好分析一遍才行吗?
AI,小小吐槽一下。
问题描述开始:
====================================================================================
首先有这样一个类A,继承了public CCLayer, public CCTableViewDataSource, public CCTableViewDelegate
几个类,用于实现CCTableView的滑屏功能。 显示一张张的图片
像这样(图1)
然后再建一个类B,其只继承了 CCLayer , 为的是显示滑屏上小图片的放大版本,
像这样显示(图2)
而类B,我是在类A中通过这样的方式添加的
// 类A.cpp
类B *layer = 类B::create(unClickIndex);
layer->setScale(0);
this->addChild(layer, HIGH);
一点击图1上的小图,就显示图2上的大图,就是这样。
然而在图2显示时,后面的滑屏和返回功能我必须屏蔽,当按图2上的关闭按钮把图关闭回到图1时,又需要恢复
滑屏和返回按钮的功能,所以这里我就在类B里用了
CCNotificationCenter::sharedNotificationCenter()->postNotification("Resume", NULL);
这个发送消息的方法。
具体代码如下:
void CScreenshotAmplify::closeBigScreenshot(CCObject *pSender)
{
// this->removeChildByTag(BIGSCREENSHOT_TAG, true);
// this->removeChildByTag(SCREENSHOTFRAME_TAG, true);
this->removeAllChildrenWithCleanup(true);
// 从精灵帧缓存池删除图片缓存
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("selectScenePic/button.plist");
// 向浏览界面发送恢复点击的消息
CCNotificationCenter::sharedNotificationCenter()->postNotification("Resume", NULL);
// 关闭时标记变量置为0
setFlag(0);
}
当类B界面关闭时就发送这个消息到类A,让类A恢复滑屏等功能。
经过前面的提问知道,在接收消息的类A,需要调用
CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);
取消消息的订阅。而我把这方法放在 OnExit里面
之后重点在这里
而现在相当奇怪的就是当加上这句,退出类A类B的界面后,去到别的界面,再开启另外一个带滑屏的界面时,就会报错!
错误定位到了CCTableView.cpp上的
unsigned int CCTableView::_indexFromOffset(CCPoint offset)
{
int index = 0;
const int maxIdx = m_pDataSource->numberOfCellsInTableView(this)-1; // 定位到这里
。。。。。
而且我把 OnExit里的 CCNotificationCenter 这句代码注释掉同样报错,必须连同 OnExit这方法也一起注释掉才行。
即使把CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);这句放到析构函数中也是一样
的情况。当然不加这句最后也是会出错的。
这实在是让人很摸不着头脑。分析了很久没找到解决的方向。希望给点解决思路我这只渣得不行的渣鸟吧。这引擎实在是不好驾驭。。。。。