关于ios上的UITextFieldDelegate

时间:2014-01-25 05:32:17

标签: java libgdx robovm

我们正在向ios移植一个libgdx游戏 我创建了一个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 个答案:

答案 0 :(得分:0)

您的Delegate实例可能在调用之前已经过GCed。试试这个:

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

addStrongRef(...)调用阻止Delegate Java实例进行GC操作,直到释放UITextField Objective-C实例为止。这是必需的,因为UITextField不保留(增加引用计数)您设置为委托的实例。

在未来的RoboVM版本中,addStrongRef(...)电话会自动为您完成。