Cocos2dx3.15 EditBox在退出时会报错,整个应用崩溃,是怎么回事?

在ios上刚升级到3.15版本,编译完成运行后,凡是到EditBox输入框的地方,输入完成,点击按钮提交关闭layer时,就会报错:Assert failed: Node still marked as running on node destruction! Was base class onExit() called in derived class onExit() implementations?,然后应用就崩溃了。我追踪了一下,在layer关闭时,editBoxEditingDidEnd(ui::EditBox* editBox)是执行了的,然后报错。我现在想知道,在关闭layer前要先停止EditBox的运行吗?又如何让停止呢?

补充一下,这是模拟器上调试的效果,正准备用真机试试。后面测试的结果再发上来,同样的代码,在3.11.1版编译的安卓应用没有任何问题(win7上弄得),但这个在ios上的3.15版就有不少问题,输入框位置也偏上,还不知道原因。请@子龙山人帮忙看看,谢谢!

@zilong

今晚用iphone6真机实测,效果是:1)位置偏高,比之前设计的位置偏高了一行的高度。2)第一次能正常录入,可以实现自顶向下的输出效果(多行),但是按确定不会结束输入。通过按钮返回后,真机上没有崩溃,貌似正常。但是第二次再打开输入界面时,整个输入框完全不响应了,操作无一点响应,软键盘也不出来了。再打开其它的输入页面,所有的输入都不响应了。3)输入200字后,用Label输出到页面上,字也显示不出来,全是空的。 这个问题在3.11.1中遇到,现在还是这样,在安卓上也这样,现在在苹果上也这样,实在是搞不明白,只有我一个人遇到吗?100字左右还是能显示了,再长就不一定了。

能不能提供一个标准的调用代码啊,我可以比较一下,我到底哪里搞错了。我先发我的调用代码吧:

Size editboxSize = Size(visibleSize.width - 40 - 40, 90);
auto editText = ui::EditBox::create(editboxSize, “transparentfill.png”, ui::Widget::TextureResType::LOCAL);
editText->setFont(“arial”, 46);
editText->setFontColor(Color4B(51, 51, 51, 255));
editText->setMaxLength(200);
editText->setText("");
editText->setPlaceholderFont(“arial”, 46);
editText->setPlaceholderFontColor(Color4B::GRAY);
editText->setPlaceHolder(“input text”);
editText->setReturnType(ui::EditBox::KeyboardReturnType::DONE);
editText->setInputFlag(ui::EditBox::InputFlag::SENSITIVE);
editText->setInputMode(ui::EditBox::InputMode::ANY);
editText->setDelegate(this);
this->addChild(editText, 5);
editText->setAnchorPoint(Vec2::ZERO);
editText->setPosition(Vec2(40, 40));

以上代码不知道有没有什么问题,不过之前一直用,也工作正常,是不是新版引擎修改了调用方法,由于新版引擎刚刚接触,还不太了解,希望了解的朋友指点指点,谢谢了!

偏高的问题已经清楚了,是因为不是设置的单行,造成对齐顶部了。这个问题我可以修正过来。另外发现仅有一个大输入框的备注输入页面会出现问题,导致整个输入都不能用,只要不操作这个备注输入页面,其它的输入操作没什么问题。正在进一步分析,是调用上的问题还是组件上的问题。

能否提供一个测试例,我觉得你的用户应该有问题。

好的,今晚我把这些问题做成一个测试案例发上来,如果单独案例能正常运行的话,就是我现在这个应用的问题,如果不能,就请你帮忙分析一下,谢谢!

反馈一下测试情况,今晚专门把相关的代码独立出来做了一个测试应用,在模拟器上调试,还是要崩溃。但是发布到真机后工作很正常,label的显示也正常,300个汉字依然可以正常显示。我现在也郁闷了,同样的代码为什么在现在的项目里不行,单独出来又运行的很正常,无解了。我观察了一下,新作项目的运行内存只有20M左右,而现有项目的运行内存有70M,会不会是内存消耗导致EditBox和Label工作异常呢,我后面会继续测试,直到找出问题原因。目前的情况下,测试项目我就不放上来了。

经过这几天的不断测试,之前提到的两个问题:1)EditBox输入框点击崩溃的问题,经过仔细检查,是我自己的失误造成的。因为在模拟器上调试报错,我在EditBox的回调函数里加了些不适当的调试代码,所以造成真机上调试也崩溃了,后来单独做的案例正常运行后,我比对了两边的代码才发现。目前已经修正好了,真机上运行效果很好,不过也比较疑惑,为什么在Xcode里模拟器上运行依然会报错。 2)关于label只能输出80个字,多了就不显示的问题,也发现是我自己封装的一个生成器里的代码有问题造成的,经过修正后,现在长字符串已经可以正常显示了。总得来说,问题都得到了解决,问题都是因为我自己的调用引起的。

不过这里我想反馈一个问题,不知道是不是label的bug,但是确实可以稳定的复现这个问题:我做了一个Label生成器,目的是生成的这个对象在字符串长度较短时,按照不限宽度的方式生成,这样对象的width就是字符串的实际显示长度(如果按限宽方式生成,对象的宽度永远是限制的宽度,即便显示不满),我在显示时可以左对齐或右对齐显示都比较好控制。而当字符串较长,一行显示不下时,则按限宽的方式生成,这样对象的width也是字符串的实际显示宽度,显示时也比较好控制。所以代码如下

Label*  getLabel(std::string text,float width,Color3B& fontcolor,float fontsize){
      //先不限制宽度,生成对象后在判断宽度是否大于设定的宽度,如果不大于则直接返回,否则调用可以限制高宽的参数创建。
      auto txtLabel = Label::createWithSystemFont(text, "fonts/Marker Felt.ttf", 46);
      if(txtLabel->getContentSize().width<=width){ return txtLabel};
      return Label::createWithSystemFont(text, "fonts/Marker Felt.ttf", 46, Size(width, 0));
}

结果就是这个生成方法导致了在字符串超过一定长度后就无法显示了,这时在后台会输出错误:cocos2d: Texture2D: Error uploading compressed texture level: 0 . glError: 0

我现在也不太明白,我这样用的错误在什么地方?是Label的bug,还是我调用问题,请你帮忙分析一下,谢谢!

  auto txtLabel = Label::createWithSystemFont(text, "fonts/Marker Felt.ttf", 46);

系统字体,你传一个 ttf 进去干吗?

Label*  getLabel(std::string txt,float width,Color3B& fontcolor,float fontsize){
  //先不限制宽度,生成对象后在判断宽度是否大于设定的宽度,如果不大于则直接返回,否则调用可以限制高宽的参数创建。
    auto txtLabel = Label::createWithSystemFont(txt, "Arial", 46);
    txtLabel->setColor(fontcolor);
    if(txtLabel->getContentSize().width<=width){ return txtLabel;}
    auto newtxtLabel = Label::createWithSystemFont(txt, "Arial", 46, Size(width, 0));
    newtxtLabel->setColor(fontcolor);
    return newtxtLabel;
}

我换成系统字体后效果和报错依然如此,不知道是不是我的字体名称没有填对,我在网上查了很多苹果字体名称,感觉都没什么用,显示效果完全一样,报的错也完全一样。你能不能告诉我一个苹果系统字体名称,或到哪里可以查询到。

另外 我把createWithSystemFont 换成createWithTTF后,这个方法就可以正常工作了,没有再出现错误,不过字体文件太大,装两个中文ttf字体的话,差不多就20M多了,还是只能用系统字体。