【已解决】Cocos Studio编辑的UI,在代码中报 vector subscript out of range

用cocostudio编辑了一个UI,层次结构如下
RootLayer(1)
ScrollView(2)
Layer(3)

在程序中加载该UI,同时取出Layer(3),然后用代码动态创建Node,调用Layer(3)->addChild(Node)。
代码片断:
auto rootLayer = GUIReader::getInstance()->widgetFromJsonFile(“WorldMapLayer.json”);
auto worldSv = rootLayer->getChildByName(“world_sv”);
auto citysLayer = worldSv->getChildByName(“citys_layer”);

Sprite* sprite = Sprite::create();
citysLayer->addChild(sprite);

this->addChild(rootLayer);

当运行到citysLayer->addChlid(sprite);时,报错 vector subscript out of range
详细如下:
Program: C:\windows\system32\MSVCP120D.dll
File: D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector
Line: 1201

Expression: vector subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

求解
这个帖子也是同样错误提示:http://www.cocoachina.com/bbs/read.php?tid=180738

晚上花了点时间,打断点调试了一下,终于找到原因了,其实说白了很简单,使用cocostudio编辑UI后,在程序中获取Layer,注意,该Layer是继承自Widget类的,那么如果要在Layer对象中再添加Child,该Child必须是继承自Widget的,原因请看下面。
在Layer->addChild(Widget)时,会执行Widget的一个函数

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LayoutParameter* Widget::getLayoutParameter(LayoutParameterType type)
{
return dynamic_cast<LayoutParameter*>(_layoutParameterDictionary.at(type));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

_layoutParameterDictionary是Map类型,如果添加的子结点不是Widget类型,那么_layoutParameterDictionary就是没有值,所以此处会报错!

我上面的代码中Layer->addChild(Sprite),Sprite继承自Node而不是Widget,那么自然就出错了。

希望我的问题对大家有帮助

我也遇到,但是是偶现的,奇怪