关闭 iPhone 键盘
我正在尝试重新创建类似于 safari 中使用的弹出键盘的东西。
我可以通过在视图和相应按钮上放置一个工具栏来直观地重现它,但是一旦用户触摸完成按钮,我就想不出任何方法来关闭键盘。
I am trying to recreate something similar to the popup keyboard used in safari.
I am able to visually reproduce it by placeing a toolbar over my view and the appropriate buttons, however i cant figure out any way to dismiss the keyboard once the user has touched the done button.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您需要记住几件事。 开发人员忘记设置的第一个部分是文本字段的委托。
如果您使用 Interface Builder,则必须记住,您需要将 textField 的委托设置为文件所有者。
如果您不使用 Interface Builder,请确保将文本字段的委托设置为 self。 我还包括了 returnType。 例如,如果 textField 名为 gameField:
您还必须为 ViewController 实现 UITextFieldDelegate。
最后,您需要使用 textFieldShouldReturn 方法并调用 [textField resignFirstResponder]
您的所有文本字段都将使用相同的方法,因此您只需进行一次此设置。 只要为textField设置了delegate,就为界面实现了UITextFieldDelegate,添加textFieldShouldReturn方法并调用
resignFirstResponder 你的集合。
There is a couple of things you need to remember. The number #1 part developers forget to set is the delegate of the textField.
If you are using the Interface Builder, you must remember that you need to set the delegate of the textField to the file Owner.
If you are not using Interface Builder then make sure you set the delegate of the textfield to self. I also include the returnType. For Example if the textField was called gameField:
You must also implement the UITextFieldDelegate for your ViewController.
Finally you need to use the textFieldShouldReturn method and call [textField resignFirstResponder]
All your textFields will use this same method so you only need to have this setup once. As long as the delegate is set for the textField, the UITextFieldDelegate is implemented for the interface, you add the textFieldShouldReturn method and call the
resignFirstResponder your set.
您是否尝试过:
其中
viewReceivingKeys
是正在接收文本输入的 UIView?Have you tried:
where
viewReceivingKeys
is the UIView that is receiving the text input?如果您在 Interface Builder 中构建自己的视图,请将视图控制器设置为文本字段的委托,并在视图控制器中从 UITextFieldDelegate 实现 textFieldShouldReturn: 。
UITextFieldDelegate textFieldShouldReturn:在 iphone cocoa 文档中
If your building your own views in Interface Builder, set your view controller to be delegate for the text field and implement textFieldShouldReturn: from UITextFieldDelegate in your views controller.
UITextFieldDelegate textFieldShouldReturn: in the iphone cocoa docs
如果您正在谈论从
UITextField
而不是UITextView
关闭键盘。 你的问题还不清楚吗? 如果您确保您的类在接口文件中被标记为UITextFieldDelegate
,那么您应该实现如下两个委托方法,
但是如果您使用的是
UITextView
> 那么事情就有点复杂了。UITextViewDelegate
协议缺少与textFieldShouldReturn:
方法等效的方法,大概是因为我们不应该期望 Return 键是用户希望停止编辑文本的信号。多行文本输入对话框(毕竟,用户可能希望通过按 Return 来插入换行符)。但是,有多种方法可以解决
UITextView
无法使用键盘辞去第一响应者身份的问题。 通常的方法是当UITextView
显示弹出键盘时在导航栏中放置一个 Done 按钮。 点击后,此按钮会要求文本视图辞去第一响应者的角色,然后关闭键盘。但是,根据您规划界面的方式,您可能希望当用户点击
UITextView
本身之外时,UITextView
退出。 为此,您需要对UIView
进行子类化以接受触摸,然后指示文本视图在用户点击视图本身外部时退出。创建一个新类,
然后在实现中实现
touchesEnded:withEvent:
方法并要求UITextView
辞去第一响应者身份。添加类后,您需要保存所有更改,然后进入 Interface Builder 并单击您的视图。 在实用工具面板中打开身份检查器,并将 nib 文件中的视图类型更改为
CustomView
而不是默认的UIView
类。 然后在 Connections Inspector 中,将textView
出口拖动到UITextView
。 执行此操作后,一旦您重建应用程序,活动 UI 元素外部的触摸现在将关闭键盘。 但请注意,如果您要子类化的 UIView 位于其他 UI 元素“后面”,则这些元素将在触摸到达 UIView 层之前拦截它们。 因此,虽然这个解决方案很优雅,但它只能在某些情况下使用。 在许多情况下,您必须诉诸暴力方法,在导航栏中添加完成按钮来关闭键盘。If you're talking about dismissing the keyboard from a
UITextField
rather than aUITextView
. Your question isn't that clear? If you are then ensure your class is marked as aUITextFieldDelegate
in the interface file,and then you should implement the two delegate methods as below,
However if you're using a
UITextView
then things are a bit more complicated. TheUITextViewDelegate
protocol lacks the equivalent to thetextFieldShouldReturn:
method, presumably since we shouldn’t expect the Return key to be a signal that the user wishes to stop editing the text in a multi-line text entry dialog (after all, the user may want to insert line breaks by pressing Return).However, there are several ways around the inability of the
UITextView
to resign as first responder using the keyboard. The usual method is to place a Done button in the navigation bar when theUITextView
presents the pop-up keyboard. When tapped, this button asks the text view to resign as first responder, which will then dismiss the keyboard.However, depending on how you’ve planned out your interface, you might want the
UITextView
to resign when the user taps outside theUITextView
itself. To do this, you’d subclassUIView
to accept touches, and then instruct the text view to resign when the user taps outside the view itself.Create a new class,
Then, in the implementation, implement the
touchesEnded:withEvent:
method and ask theUITextView
to resign as first responder.Once you’ve added the class, you need to save all your changes, then go into Interface Builder and click on your view. Open the Identity inspector in the Utility pabel and change the type of the view in your nib file to be your
CustomView
rather than the defaultUIView
class. Then in the Connections Inspector, drag thetextView
outlet to theUITextView
. After doing so, and once you rebuild your application, touches outside the active UI elements will now dismiss the keyboard. Note however that if theUIView
you are subclassing is “behind” other UI elements, these elements will intercept the touches before they reach the UIView layer. So while this solution is elegant, it can be used in only some situations. In many cases, you’ll have to resort to the brute force method of adding a Done button to the navigation bar to dismiss the keyboard.使用导航控制器并在完成后弹出视图?
例如,我使用这样的代码将“关于”框滑入:
然后当单击该“关于”框中的按钮时,我用它来摆脱它:
在我的情况下,“关于”框占据了整个屏幕,但我不这样做我认为这并不需要它才能起作用。
编辑:我想我可能误解了你的问题。 如果您自己伪造整个键盘视图,则与我的代码类似。 我认为,如果它是普通键盘,并且在顶部添加了工具栏,那么辞职第一响应者是正确的方法。
use a navigation controller and pop the view when done?
for example, I use code like this to slide an about box in:
and then when the button in that about box is clicked, I use this to get rid of it:
In my case the about box occupies the whole screen, but I don't think it would have to for this to work.
edit: I think I may have misunderstood your question. Something along the lines of my code would be if you are faking the whole keyboard view yourself. I think that resign first responder is the right way to do it if it is the normal keyboard with your toolbar added on top.