在文本字段之间更改焦点时保持键盘打开

Keep keyboard open on focus change between text fields

在我用 Appcelerator Titanium 为 iOS 和 Android 开发的应用程序中,我有一些文本字段,当用户单击 return 按钮时,我想在这些文本字段之间导航。

在 Android 上,这是通过接下来设置 return 键类型自动处理的。对于 iOS,我必须添加事件侦听器,以便在单击 return 按钮时触发对下一个字段的关注。

但是,当焦点发生切换时,键盘会向下移动然后再次向上移动。显示行为的代码示例:

var win = Ti.UI.createWindow({width: Ti.UI.FILL,height: Ti.UI.FILL,backgroundColor:'white'});
var input1 = Ti.UI.createTextField({
    width: 50, height:20, top: 50, hintText: 'input1',
    returnKeyType: Ti.UI.RETURNKEY_NEXT
});
input1.addEventListener("return",function(){input2.focus();});
win.add(input1);
var input2 = Ti.UI.createTextField({
    width: 50, height:20, top: 100, hintText: 'input2',
    returnKeyType: Ti.UI.RETURNKEY_NEXT
});
input2.addEventListener("return",function(){input1.focus();});
win.add(input2);
win.open();

根据之前给出的答案(后来删除),可以在原版中保持键盘打开 iOS。那么 - 有没有办法使用这种技术在 Appcelerator 中将文本字段焦点切换到 iOS 期间保持键盘打开?谢谢!

您可以只使用 returnKeyType :Titanium.UI.RETURNKEY_NEXT 属性 作为您的 TextField

更多详情Titanium.UI.TextField

在查看 iOS 的 Titanium 资源之前,我在这上面花了几个小时(我真的不会说 Obj.C)。最后我了解到我所知道的 属性 的表现与我的预期完全相反。您需要做的就是将 suppressReturn 设置为 false

我还将为在 return 上前进到下一个字段的表单提供我的可移植代码:

景色

<View id='signupForm' class='formContainer'>
    <TextField id='emailField' name='email' class='loginField emailField' hintText='email' onReturn='selectNextField' onFocus='scrollToField' />
    <View class="hrLine"></View>
    <TextField id='passwordField' name='password' class='loginField' hintText='password' passwordMask='true' onReturn='selectNextField' onFocus='scrollToField' />
    <View class="hrLine"></View>
    <TextField id='fnameField' class='loginField' name='fname' hintText='first name' onReturn='selectNextField' onFocus='scrollToField' autocapitalization='Ti.UI.TEXT_AUTOCAPITALIZATION_WORDS'/>
    <View class="hrLine"></View>
    <TextField id='lnameField' class='loginField' name='lname' hintText='last name' returnKeyType='Ti.UI.RETURNKEY_GO' onReturn='submitSignup' onFocus='scrollToField' autocapitalization='Ti.UI.TEXT_AUTOCAPITALIZATION_WORDS'/>
</View>

风格

'.loginField': {
    height: 40,
    width: '100%',
    opacity: 1,
    paddingLeft: 10,
    returnKeyType: Ti.UI.RETURNKEY_NEXT,
    // THE CRITICAL LINE
    suppressReturn: false
}

控制器

// controller.js
function selectNextField(e) {
    var hint = e.source.getHintText(),
        nextOne = false,
        finished = false;

    // find currently focused field then declare that the next field is THE ONE
    _.each($.signupForm.getChildren(), function(view) {
        if(finished) {
            return;
        }

        if(view.getHintText && view.getHintText() === hint) {
            nextOne = true;
            return;
        }
        if(nextOne && view.getApiName() === 'Ti.UI.TextField') {
            finished = true;
            return view.focus();
        }
    });
}