О UITextFieldDelegate на IOS

Мы портируем игру libgdx на ios.
Я создаю UITextField и устанавливаю делегат, вот код:

this.textField.setDelegate(new Delegate(textField));

public static class Delegate extends UITextFieldDelegate.Adapter
{
    private UITextField mTextField;

    public Delegate(UITextField textField)
    {
        this.mTextField = textField;
    }

    @Override
    public void didBeginEditing(UITextField textField) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "didBeginEditing");
    }

    @Override
    public void didEndEditing(UITextField textField) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "didEndEditing");
    }

    @Override
    public boolean shouldBeginEditing(UITextField textField) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "shouldBeginEditing");
        return true;
    }

    @Override
    public boolean shouldChangeCharacters(UITextField textField,
            NSRange range, String string) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "shouldChangeCharacters");
        return true;
    }

    @Override
    public boolean shouldClear(UITextField textField) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "shouldClear");
        return true;
    }

    @Override
    public boolean shouldEndEditing(UITextField textField) {
        // TODO Auto-generated method stub
        Gdx.app.debug(TAG, "shouldEndEditing");
        return true;
    }

    @Override
    public boolean shouldReturn(UITextField textField) {
        // TODO Auto-generated method stub
        if(this.mTextField == textField)
        {
            textField.resignFirstResponder();
        }
        Gdx.app.debug(TAG, "shouldReturn");
        return true;
    }
}

в симуляторе ios при нажатии на текстовое поле происходит сбой приложения, и на консоли не появляется сообщение об ошибке. как это решить? Любая информация будет оценена! заранее спасибо!!

1 ответ

Решение

Ваш Delegate экземпляр, вероятно, был GCed, прежде чем он вызывается. Попробуй это:

Delegate delegate = new Delegate(textField);
this.textField.setDelegate(delegate);
this.textField.addStrongRef(delegate);

addStrongRef(...) вызов предотвращает Delegate Экземпляр Java от GCed до UITextField Экземпляр Objective-C освобожден. Это требуется с UITextField не сохраняет (увеличивает количество ссылок) экземпляр, который вы указали в качестве делегата.

В будущей версии RoboVM addStrongRef(...) Звонок будет сделан автоматически для вас.

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