iOS 中的 UITextField 和键盘管理问题

Posted

技术标签:

【中文标题】iOS 中的 UITextField 和键盘管理问题【英文标题】:Problems with UITextField & Keyboard Management in iOS 【发布时间】:2012-06-14 09:21:41 【问题描述】:

(我目前的目标是 ios 2.0。)

我有一个子类 UITextField 并实现 UITextFieldDelegate 协议。

一开始我没有把class设置为自己的delegate,当我在字段中点击时,键盘自动弹出。到现在为止还挺好。

我使用 UIReturnKeyDone 发送 setReturnKeyType: 消息,因此它会将右下角的按钮更改为“完成”。

问题是,当我点击完成或按下 [Return] 时,什么都没有发生 - 键盘不会消失。

我尝试将 self 添加为结束编辑通知的观察者,但单击完成时它从未被调用;从谷歌搜索来看,似乎只有当该字段辞去第一响应者时才会被解雇——这是我无法做到的。

然后我在这里找到了建议添加 self 作为委托并处理 textFieldShouldReturn: 的答案。问题是,一旦我将 self 添加为委托,当您单击该字段时键盘不再弹出(并且它没有获得焦点) - 它似乎没有成为第一响应者。

我尝试处理 textFieldShouldBeginEditing: 并返回 YES(文档说如果没有被覆盖应该是默认值),这被调用了,但没有任何区别。在我的无知中,我尝试了 [textField becomeFirstResponder] 并获得了堆栈溢出的奖励(现在我知道这是为了响应 trying 成为第一响应者而调用的)。

我现在彻底卡住了!

有人可以帮忙吗?我只希望当用户单击完成或按 [Return] 时键盘消失。

【问题讨论】:

删除任何其他内容并添加此委托 - (BOOL)textFieldShouldReturn:(UITextField *)theTextField [theTextField resignFirstResponder];return YES; 我假设您在这里说“使用单独的对象作为委托”?我刚刚发现我们不应该使用文本字段作为它自己的代表。当它试图显示键盘时,我遇到了一个无限循环 - 因此,没有出现键盘。 【参考方案1】:

您是使用 xib 还是以编程方式进行?如果您使用的是 xib,那么您可能忘记在 File's Owner 中连接委托。

(BOOL)textFieldShouldReturn:(UITextField *)textField   

    [textField resignFirstResponder];
    return YES;

试试这个。

【讨论】:

我已经在上面提到过使用它 - 因为键盘现在永远不会显示,所以它永远不会被调用。【参考方案2】:

我的错。事实证明,您不应该将文本字段的委托设置为自身 - 由于未处理的选择器被转发给其委托,因此存在复杂性。如果它没有响应选择器,则消息将发送给它的委托……这就是它本身,我们已经知道它没有响应。因此,无限循环。

使用单独的对象作为委托非常有效。

希望这将帮助其他人避免同样的问题。

【讨论】:

以上是关于iOS 中的 UITextField 和键盘管理问题的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView 中的 UITextField 在 iOS 中不显示键盘

iOS7 模拟器中的 UITextField 不接受来自 mac 键盘的任何输入

iOS 键盘挡住UITextField

禁用iOS键盘中的输入按钮

iOS-基于键盘显示的UITextField高度和按钮移动的变化

在 UITextField 和软件键盘 ios 之间提供最小填充