5

我正在为我的应用程序制作一个登录屏幕,当有一个尚未填写的字段时,我希望返回按钮说“下一步”,并且当所有字段都已填写时它会说“开始”(我说的是UITextFields)。

下面的代码运行良好,因为它在正确的时刻显示 Next 和 Go。但是,每当它从“下一步”变为“开始”时,键盘上的下一次点击就会被忽略。当它说“Go”并且我通过退格清空文本字段时,没有这样的问题,它应该显示 Next。几乎就像旧键盘仍然存在并在被点击后消失一样。

我的问题是:这个问题的根源是什么,更重要的是我如何摆脱键盘的冻结?

UITextField *theSender = (UITextField *)sender;
if (allTextFieldsAreFilled) {
    if (theSender.returnKeyType!=UIReturnKeyGo) {
        theSender.returnKeyType = UIReturnKeyGo;
        [theSender resignFirstResponder];
        [theSender becomeFirstResponder];
    }
} else {
    if (theSender.returnKeyType!=UIReturnKeyNext) {
        theSender.returnKeyType = UIReturnKeyNext;
        [theSender resignFirstResponder];
        [theSender becomeFirstResponder];
    }
}

每次更改三个 UITextField 之一的值时都会调用此代码,因此它是一个连接到 Editing Changed 事件的 IBAction。

在此先感谢您的帮助!

编辑

我发现只有当文本字段设置为安全(密码)时才会发生这种情况。当它未设置为安全时,它不会冻结,我的代码可以完美运行!问题是“开始”按钮的更改通常会在“安全”文本字段是第一响应者时发生。所以这不会改变任何问题。

4

1 回答 1

1

我创建了一个新的Single View Application项目来测试它;并在ViewController.m

#import "ViewController.h"

@interface ViewController () <UITextFieldDelegate>
{
    @private
    IBOutlet UITextField* m_fieldA;
    IBOutlet UITextField* m_fieldB;
    IBOutlet UITextField* m_fieldC;
}

@end

@implementation ViewController

// connected to Editing Did Begin
- (IBAction) onFocus:(UITextField*)_textField
{
    [self updateKeyboardFor:_textField];
}

// connected to Editing Changed
- (IBAction) onChanged:(UITextField*)_textField
{
    [self updateKeyboardFor:_textField];
}

- (void) updateKeyboardFor:(UITextField*)_textField
{
    bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length];

    if (allTextFieldsAreFilled)
    {
        if (_textField.returnKeyType != UIReturnKeyGo)
        {
            _textField.returnKeyType = UIReturnKeyGo;
            //[_textField resignFirstResponder];
            //[_textField becomeFirstResponder];
            [_textField reloadInputViews];
        }
    }
    else
    {
        if (_textField.returnKeyType != UIReturnKeyNext)
        {
            _textField.returnKeyType = UIReturnKeyNext;
            //[_textField resignFirstResponder];
            //[_textField becomeFirstResponder];
            [_textField reloadInputViews];
        }
    }
}

// A part of UITextFieldDelegate
- (BOOL) textFieldShouldReturn:(UITextField*)_textField
{
    if (_textField.returnKeyType == UIReturnKeyGo)
    {
        [_textField resignFirstResponder];

        // go off and perform 'go'
    }
    else
    {
        if(_textField == m_fieldA) [m_fieldB becomeFirstResponder];
        if(_textField == m_fieldB) [m_fieldC becomeFirstResponder];
        if(_textField == m_fieldC) [m_fieldA becomeFirstResponder];
    }

    return true;
}

@end

然后在 XIB 中创建三个UITextFields并将它们连接到IBOutlets, IBActions,并将此视图控制器设置delegate为所有字段。

无论安全领域如何,一切似乎都可以正常工作。

我的猜测是您的问题出在您移至“下一个”字段的代码中;而不是在您发布的代码中。还要确保您的所有网点和代表都正确连接。


更新:我已经编辑了上面的代码。注释掉的行是问题所在,您应该使用它reloadInputViews来更新按钮。

似乎它没有锁定键盘;但它所做的是在您输入第一个字母并发出辞职/成为电话以刷新按钮之后,第二次按下将覆盖第一次。这似乎是 iOS 中的一个错误……如果在第一个字母后键入空格,则更明显。当我注意到我添加了一个标签,该标签使用密码字段的内容更新了它的内容时,发生了什么就更加清楚了。

于 2013-03-18T11:27:51.767 回答