iphone开发中 TextField如何按return 让键盘消失

iOS开发中,iphone 的键盘比iOS 少了一个让键盘消失的按键,所以,在TextField 中输入内容后,键盘并不会自动消失,需要额外处理。怎么处理呢?

  原理呢,是ios的FirstRespond机制,当TextField成为FirstRespond时,键盘出现;当把FirstRespond转移到ViewController或窗体,TextField失去FirstRespond时,键盘消失。所以要通过实现textFieldShouldReturn方法,在这个方法里,重新分配FirstRespond事件。

具体的做法,是两步:

第一步,设定TextField到ViewController的委托;

第二步,在ViewController里,实现TextFieldDelegate,实现其中的一个textFieldShouldReturn方法


建立文本栏的委托连接

您还需要在应用程序中建立另一个连接:您需要将文本栏连接到您指定的委托对象上。在本教程中,您将视图控制器用作文本栏的委托。

您需要为文本栏指定一个委托对象。这是因为当用户轻按键盘中的“Done”按钮时,文本栏发送消息给它的委托(前面提到过委托是代表另一个对象的对象)。在后面的步骤中,您将使用与此消息相关联的方法让键盘消失。

确定串联图文件已在画布上打开。如果未打开,则在项目导航器中选择 MainStoryboard.storyboard

设定文本栏的委托
  1. 在视图中,按住 Control 键将文本栏拖移到场景台中的黄色球体(黄色球体代表视图控制器对象)。

    松开 Control 键并停止拖移时,看到的应该是这样的:

  2. 在出现的半透明面板的“Outlets”部分中选择“delegate”。


将视图控制器配置为文本栏的委托

如果生成并运行应用程序,在点按按钮时应该会看到标签显示“Hello, World!”。如果您选择文本栏并开始在键盘上键入,您会发现完成文本输入后,仍然无法让键盘消失。

在 iOS 应用程序中,允许文本输入的元素成为第一响应器时,键盘会自动出现;元素失去第一响应器状态时,键盘会自动消失。(前面提到过第一响应器是第一个接收各种事件通知的对象,例如轻按文本栏来调出键盘。)虽然无法从应用程序直接将消息发送给键盘,但是可以通过切换文本输入 UI 元素的第一响应器状态这种间接方式,使键盘出现或消失。

UITextFieldDelegate 协议是由 UIKit 框架定义的,它包括 textFieldShouldReturn: 方法,当用户轻按“Return”按钮(不管该按钮的实际名称是什么)时,文本栏调用该方法。因为您已经将视图控制器设定为文本栏的委托(在“设定文本栏的委托”中),可以实施该方法,通过发送 resignFirstResponder 消息强制文本栏失去第一响应器状态,以该方法的副作用使键盘消失。

注:协议基本上只是一个方法列表。如果一个类符合(或采用)某个协议,则保证它可以实施该协议所要求的方法。(协议也可以包括一些可选的方法。)委托协议指定了一个对象可能向其委托发送的所有消息。

将 HelloWorldViewController 配置为文本栏的委托
  1. 如有需要,在项目导航器中选择 HelloWorldViewController.m

  2. 在 HelloWorldViewController.m 文件中实施 textFieldShouldReturn: 方法。

    此方法应该指示文本栏放弃第一响应器的状态。实现结果应该是这样的:

    - (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == self.textField) {
            [theTextField resignFirstResponder];
        }
        return YES;
    }

    在本应用程序中,没有必要真正测试 theTextField == self.textField 表达式,因为只有一个文本栏。但这是一个很好的模式,因为有些场合您的对象可能是不只一个同类对象的委托,所以可能有需要对它们加以区分。

  3. 在项目导航器中选择 HelloWorldViewController.h

  4. 在 @interface 行的末尾,添加 <UITextFieldDelegate>

    您的接口声明应如下图所示:

    @interface HelloWorldViewController :UIViewController <UITextFieldDelegate>

    此声明指定 HelloWorldViewController 类采用 UITextFieldDelegate 协议。



你可能感兴趣的:(iphone开发中 TextField如何按return 让键盘消失)