Неожиданное свойство: 'max_length'! после добавления пользовательских свойств в пользовательский класс в CocosBuilder
В CocosBuilder у меня есть собственный класс с именем TextInput
используется для ввода пользователя, то я хочу добавить max_length
значение для ограничения длины пользовательского ввода.
Это выглядит ниже:
Но когда я бегу, я получаю следующую ошибку:
Cocos2d: Unexpected property: 'max_length'!
Я пытался добавить int max_length;
в TextInput.h
, Но ничего не изменилось.
Вот мой относительный код.
TextInput.h
#ifndef __CrossKaiser__TextInput__
#define __CrossKaiser__TextInput__
#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;
using namespace cocos2d::extension;
class TextInput : public CCTextFieldTTF
{
public:
CREATE_FUNC(TextInput);
TextInput();
virtual ~TextInput();
virtual bool init();
virtual void onEnter();
virtual void insertText(const char * text, int len);
virtual void deleteBackward();
int max_length;
};
#endif
TextInputLoader.h
#ifndef __CrossKaiser__TextInputLoader__
#define __CrossKaiser__TextInputLoader__
#include "TextInput.h"
/* Forward declaration. */
class CCBReader;
class TextInputLoader : public cocos2d::extension::CCLabelTTFLoader{
public:
CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(TextInputLoader, loader);
protected:
CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(TextInput);
};
#endif
Итак, мой вопрос: как правильно использовать функцию "Пользовательские свойства"?
1 ответ
Я решаю эту проблему, сначала посмотрев на место, где Cocos2d: Unexpected property: 'max_length'!
пришло сообщение об ошибке.
Он находится в CCNodeLoader.cpp
:
#define PROPERTY_TAG "tag"
void CCNodeLoader::onHandlePropTypeInteger(CCNode * pNode, CCNode * pParent, CCString * pPropertyName, int pInteger, CCBReader * pCCBReader) {
if(pPropertyName->compare(PROPERTY_TAG) == 0) {
pNode->setTag(pInteger);
} else {
ASSERT_FAIL_UNEXPECTED_PROPERTY(pPropertyName);
}
}
Из этого кода мы можем видеть, что он обрабатывает только свойство "tag", а все остальные свойства генерируют assert.
Поэтому я подумал, что могу переопределить этот метод, в котором я могу обрабатывать свое собственное новое свойство.
Поэтому я добавляю метод переопределения в мой TextInputLoader.cpp
:
#define PROPERTY_MAX_LENGTH "max_length"
void TextInputLoader::onHandlePropTypeInteger(CCNode * pNode, CCNode * pParent, CCString * pPropertyName, int pInteger, CCBReader * pCCBReader)
{
if(pPropertyName->compare(PROPERTY_TAG) == 0) {
pNode->setTag(pInteger);
}
else if (pPropertyName->compare(PROPERTY_MAX_LENGTH) == 0){
((TextInput*)pNode)->setMaxLength(pInteger);
}
else {
ASSERT_FAIL_UNEXPECTED_PROPERTY(pPropertyName);
}
}
Затем я добавляю свойство в моем TextInput.h
:
CC_SYNTHESIZE(unsigned int, m_max_length, MaxLength);
И это сработало. Моя проблема была решена.
Кстати, здесь я только переопределить onHandlePropTypeInteger
, которые обрабатывают целое число.
Если кто-то хочет другое пользовательское свойство типа, он может переопределить соответствующий метод в CCNodeLoader.cpp
, такие как onHandlePropTypeString
, onHandlePropTypeFloat
и так далее.