UITextField 辞职 firstResponder 太早了
Posted
技术标签:
【中文标题】UITextField 辞职 firstResponder 太早了【英文标题】:UITextField resigning firstResponder too early 【发布时间】:2015-03-03 21:23:20 【问题描述】:我有两个 UITextField 实例。第一个文本字段的returnKeyType
是UIReturnKeyNext
,第二个文本字段returnKeyType
是UIReturnKeyDone
。基于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.placeholder
和textField.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,辞职第一响应者时,导致文本的奇怪动画滚动