UITextField 辞职 firstResponder 太早了

Posted

技术标签:

【中文标题】UITextField 辞职 firstResponder 太早了【英文标题】:UITextField resigning firstResponder too early 【发布时间】:2015-03-03 21:23:20 【问题描述】:

我有两个 UITextField 实例。第一个文本字段的returnKeyTypeUIReturnKeyNext,第二个文本字段returnKeyTypeUIReturnKeyDone。基于this SO answer,我正在尝试在单击“下一步”按钮时辞去第一个文本字段的第一响应者,然后让第二个文本字段成为第一响应者。当在第二个文本字段上单击“完成”按钮时,第一响应者辞职,键盘消失。

下面是我的代码:

- (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;

单击“下一步”按钮时,第一个文本字段成功退出第一响应者,第二个文本字段确实成为新的第一响应者。但是,在单击“完成”按钮之前,第二个文本字段 立即 似乎放弃了它的第一响应者状态。

谁能告诉我为什么第二个文本字段在单击“完成”按钮之前退出它的第一响应者状态?谢谢!

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

[self postNotificationSettingsUpdate:settingsDictionary];

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

【问题讨论】:

是否有任何其他事件可能导致文本字段辞职(代表)?您的文本字段嵌入在哪里?您的代码应该可以工作(尽管它可以像@random 写的那样进行优化)。 嗨@croX,它们嵌入在表格视图单元格中。如果用户单击屏幕上的其他位置,我确实有一种方法可以为文本字段设置endEditing:YES ...我想知道这是否会导致它?感谢@random 的回答,我确实优化了我的代码。 嗯,当文本字段成为/退出第一响应者时,您是否会重新加载表格视图? 我想我可能找到了问题的一部分……我的 if 语句中有几行我没想到对此有任何影响,但是显然是的。我现在要编辑我的问题。 【参考方案1】:

如果你想切换文本字段,你不需要调用resignFirstResponder。我已经成功地尝试了这个:

- (BOOL)textFieldShouldReturn:(UITextField *)textField

    if (textField == _textFieldOne)
        [_textFieldTwo becomeFirstResponder];
    
    else if (textField == _textFieldTwo)
        [textField resignFirstResponder];
    

return YES;


【讨论】:

我不确定谁-1 投票了;不是我。我没有意识到不需要打电话给resignFirstResponder。但是,在单击“完成”按钮之前我的 textFieldTwo 的第一响应者被辞职的问题仍然存在。 您的回答很好,因为当您首先要调用becomeFirstResponder 时,不需要在文本字段上调用resignFirstResponder。尽管如此,narner 的方法与您的解决方案具有相同的效果。因此,它在这种特殊情况下无济于事。我相信他还有其他一些事件在起作用,导致 textfieldTwo 放弃其第一响应者状态。 @narner 你是否实现了任何其他UITextField 委托方法? @croX 是的,我已经更新了我的答案并添加了几行代码 感谢您的帮助!我确实实现了textFieldDidBeginEditing,以便将textField.placeholdertextField.text 设置为@""。另外,我确实在我的代码中添加了return YES,但忘记将它放在我的问题中。我现在就这样做。【参考方案2】:

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

具体的违规代码行如下:

    [self postNotificationSettingsUpdate:settingsDictionary];

调用下面的方法:

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

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

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

After doing that, the second-text field would become the first responder when the 'Next' button of the first-text field was selected, and would resign it's first responder status when the 'Done' button was selected.

【讨论】:

以上是关于UITextField 辞职 firstResponder 太早了的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 辞职 firstResponder 太早了

Swift 如何让所有 uiTextfield 上的第一响应者辞职

UITextField,辞职第一响应者时,导致文本的奇怪动画滚动

UITextField 辞职第一响应者 iOS4

iOS:响应者辞职时,文本从子类 UITextfield 中消失

使用 UIToolbar/UITextField 辞职第一响应者问题