Неожиданное свойство: '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 и так далее.

Другие вопросы по тегам