Objective c 编辑时更改returnButton可将键盘冻结1次

Objective c 编辑时更改returnButton可将键盘冻结1次,objective-c,ios,uitextfield,Objective C,Ios,Uitextfield,我正在为我的应用程序制作一个登录屏幕,当有一个字段尚未填写时,我希望返回按钮显示“下一步”,当所有字段都已填写时,返回按钮应该显示“Go”(我指的是UITextFields) 下面的代码运行良好,因为它在正确的时刻显示Next和Go。但每当它从“下一步”变为“开始”时,键盘上的下一次点击将被忽略。当它说“Go”并且我通过退格清空textfield时,就没有这样的问题了,它应该显示Next。这几乎就像旧键盘还在那里,被敲击后就消失了 我的问题是:这个问题的根源是什么?更重要的是,我如何摆脱键盘的冻

我正在为我的应用程序制作一个登录屏幕,当有一个字段尚未填写时,我希望返回按钮显示“下一步”,当所有字段都已填写时,返回按钮应该显示“Go”(我指的是UITextFields)

下面的代码运行良好,因为它在正确的时刻显示Next和Go。但每当它从“下一步”变为“开始”时,键盘上的下一次点击将被忽略。当它说“Go”并且我通过退格清空textfield时,就没有这样的问题了,它应该显示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];
    }
}
每次更改三个UITextFields之一的值时,都会调用此代码,因此它是连接到Editing changed事件的iAction

提前感谢您的帮助

编辑

我发现只有当textfield设置为secure(password)时才会发生这种情况。当它没有设置为安全,它将不会冻结,我的代码工作完美!问题是,当“安全”文本字段是第一个响应者时,对“Go”按钮的更改通常会发生。因此,这不会改变问题的任何方面。

我创建了一个新的单视图应用程序项目来测试这一点;并在
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
#导入“ViewController.h”
@界面视图控制器()
{
@私人的
IBUitextField*m_fieldA;
IBUitextField*m_fieldB;
IBUitextField*m_fieldC;
}
@结束
@实现视图控制器
//连接到编辑确实开始了
-(iAction)onFocus:(UITextField*)\u textField
{
[self-updateKeyboardFor:_textField];
}
//已连接到已更改的编辑
-(iAction)一旦更改:(UITextField*)\u textField
{
[self-updateKeyboardFor:_textField];
}
-(void)updateKeyboardFor:(UITextField*)\u textField
{
bool alltextfieldsarefiled=[m_fieldA.text length]&&&[m_fieldB.text length]&&[m_fieldC.text length];
如果(已填写所有文本字段)
{
if(_textField.returnKeyType!=UIReturnKeyGo)
{
_textField.returnKeyType=UIReturnKeyGo;
//[_textField辞职FirstResponder];
//[_textField成为第一响应者];
[_textfieldreloadinputviews];
}
}
其他的
{
if(_textField.returnKeyType!=UIReturnKeyNext)
{
_textField.returnKeyType=UIReturnKeyNext;
//[_textField辞职FirstResponder];
//[_textField成为第一响应者];
[_textfieldreloadinputviews];
}
}
}
//UITextFieldDelegate的一部分
-(BOOL)textField应返回:(UITextField*)\u textField
{
if(_textField.returnKeyType==UIReturnKeyGo)
{
[_textField辞职FirstResponder];
//出发表演“出发”
}
其他的
{
如果(_textField==m_fieldA)[m_fieldB成为第一响应者];
如果(_textField==m_fieldB)[m_fieldC成为第一响应者];
如果(_textField==m_fieldC)[m_fieldA成为第一响应者];
}
返回true;
}
@结束
然后在XIB中创建三个
UITextFields
,并将它们连接到
IBOutlets
IBActions
,并将此视图控制器设置为所有字段的
委托

不管安全领域如何,所有这些似乎都能正常工作

我的猜测是,您的问题出现在代码中的某个地方,您将移动到“下一个”字段;而不是在你发布的代码中。还要确保您的所有门店和代表都已正确连接


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


似乎它没有锁定键盘;但它所做的是,在你输入第一个字母并进行辞职/成为刷新按钮的呼叫后,第二次按下将覆盖第一次。这似乎是iOS中的一个bug。。。如果在第一个字母后键入空格,则更为明显。当我注意到我添加了一个标签,用密码字段的内容更新了它的内容,它更清楚地显示了发生了什么。

Hmm;一定还有别的事。您使用的是什么SDK、iOS和设备?你试过做一个新的项目来测试它吗?或者只是用你现在的那个?好的;我刚刚发现了这个问题。。。进一步调查。