iOS开发中,iphone 的键盘比iOS 少了一个让键盘消失的按键,所以,在TextField 中输入内容后,键盘并不会自动消失,需要额外处理。怎么处理呢?
原理呢,是ios的FirstRespond机制,当TextField成为FirstRespond时,键盘出现;当把FirstRespond转移到ViewController或窗体,TextField失去FirstRespond时,键盘消失。所以要通过实现textFieldShouldReturn方法,在这个方法里,重新分配FirstRespond事件。
具体的做法,是两步:
第一步,设定TextField到ViewController的委托;
第二步,在ViewController里,实现TextFieldDelegate,实现其中的一个textFieldShouldReturn方法
您还需要在应用程序中建立另一个连接:您需要将文本栏连接到您指定的委托对象上。在本教程中,您将视图控制器用作文本栏的委托。
您需要为文本栏指定一个委托对象。这是因为当用户轻按键盘中的“Done”按钮时,文本栏发送消息给它的委托(前面提到过委托是代表另一个对象的对象)。在后面的步骤中,您将使用与此消息相关联的方法让键盘消失。
确定串联图文件已在画布上打开。如果未打开,则在项目导航器中选择 MainStoryboard.storyboard
。
在视图中,按住 Control 键将文本栏拖移到场景台中的黄色球体(黄色球体代表视图控制器对象)。
松开 Control 键并停止拖移时,看到的应该是这样的:
在出现的半透明面板的“Outlets”部分中选择“delegate
”。
如果生成并运行应用程序,在点按按钮时应该会看到标签显示“Hello, World!”。如果您选择文本栏并开始在键盘上键入,您会发现完成文本输入后,仍然无法让键盘消失。
在 iOS 应用程序中,允许文本输入的元素成为第一响应器时,键盘会自动出现;元素失去第一响应器状态时,键盘会自动消失。(前面提到过第一响应器是第一个接收各种事件通知的对象,例如轻按文本栏来调出键盘。)虽然无法从应用程序直接将消息发送给键盘,但是可以通过切换文本输入 UI 元素的第一响应器状态这种间接方式,使键盘出现或消失。
UITextFieldDelegate
协议是由 UIKit 框架定义的,它包括 textFieldShouldReturn:
方法,当用户轻按“Return”按钮(不管该按钮的实际名称是什么)时,文本栏调用该方法。因为您已经将视图控制器设定为文本栏的委托(在“设定文本栏的委托”中),可以实施该方法,通过发送 resignFirstResponder
消息强制文本栏失去第一响应器状态,以该方法的副作用使键盘消失。
注:协议基本上只是一个方法列表。如果一个类符合(或采用)某个协议,则保证它可以实施该协议所要求的方法。(协议也可以包括一些可选的方法。)委托协议指定了一个对象可能向其委托发送的所有消息。
如有需要,在项目导航器中选择 HelloWorldViewController.m
。
在 HelloWorldViewController.m
文件中实施 textFieldShouldReturn:
方法。
此方法应该指示文本栏放弃第一响应器的状态。实现结果应该是这样的:
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { |
if (theTextField == self.textField) { |
[theTextField resignFirstResponder]; |
} |
return YES; |
} |
在本应用程序中,没有必要真正测试 theTextField == self.textField
表达式,因为只有一个文本栏。但这是一个很好的模式,因为有些场合您的对象可能是不只一个同类对象的委托,所以可能有需要对它们加以区分。
在项目导航器中选择 HelloWorldViewController.h
。
在 @interface
行的末尾,添加 <UITextFieldDelegate>
。
您的接口声明应如下图所示:
@interface HelloWorldViewController :UIViewController <UITextFieldDelegate> |
… |
此声明指定 HelloWorldViewController
类采用 UITextFieldDelegate
协议。