UITextField太早退出firstResponder

时间:2015-03-03 21:23:21

标签: ios objective-c uitextfield resignfirstresponder becomefirstresponder

我有两个UITextField实例。第一个文本字段的returnKeyTypeUIReturnKeyNextreturnKeyType第二个文本字段为UIReturnKeyDone。根据{{​​3}},我尝试在第一个文本字段的第一个响应者辞职时“下一步”#39;单击按钮,然后让第二个文本字段成为第一个响应者。当'完成''单击第二个文本字段上的按钮,第一个响应者被解除,键盘消失。

以下是我的代码:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == _textFieldOne){
        [_textFieldOne resignFirstResponder];
        [settingsDictionary setObject: _textFieldOne.text forKey:@"TextFieldOneInfo"];
        [settingsDictionary stringValueForKey:@"TextFieldOneInfo"];
        [self postNotificationSettingsUpdate:settingsDictionary];

        didTestPostNotificationSettings = YES;
        [_textFieldTwo becomeFirstResponder];
    }
    if (textField == _textFieldTwo){
        [_textFieldTwo resignFirstResponder];
    }
    return YES;
}

当' Next'单击按钮,第一个文本字段成功地重新占用第一个响应者,第二个文本字段确实成为新的第一个响应者。然而,第二个文本字段然后立即似乎在“完成”之前辞去了它的第一响应者状态。单击按钮。

任何人都可以告诉我为什么第二个文本字段在它之前的第一个响应者状态之前就已经完成了第一个响应者的状态#Done'单击按钮?谢谢!

编辑我已将问题缩小到以下代码行:

[self postNotificationSettingsUpdate:settingsDictionary];

当它被注释掉时,文本字段的返回按钮操作会按预期运行。

2 个答案:

答案 0 :(得分:0)

如果要切换textField,则无需调用resignFirstResponder。我已成功尝试过这个:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if (textField == _textFieldOne){
        [_textFieldTwo becomeFirstResponder];
    }
    else if (textField == _textFieldTwo){
        [textField resignFirstResponder];
    }

return YES;

}

答案 1 :(得分:0)

经过一番挖掘,我相信我找到了解决方案。

特定违规行代码如下:

    [self postNotificationSettingsUpdate:settingsDictionary];

调用以下方法:

- (void)postNotificationSettingsUpdate:(NSDictionary *) updateDict {
    [self.dataCache setUserNotificationSettings:updateDict];
}

...通过网络连接发送字典信息。

这些文本视图存储在UITableView行中。在我看来发生的事情是,当调用此方法时,它重新加载了视图。解决方案是在开头和结尾添加对[tableView beginUpdates];[tableView endUpdates];的调用 - (BOOL)textFieldShouldReturn:(UITextField *)textField

执行此操作后,第二个文本字段将成为第一个响应者,当' Next'选择了第一个文本字段的按钮,并且当“完成”按钮时,它将重新签名它的第一个响应者状态。按钮被选中。