首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》7.1 文本框(UITextField)

关灯直达底部

首先打开第6章创建的HypnoNerd应用。

之前介绍过UILabel,它可以用来在界面中显示文本,但是用户无法选择或编辑UILabel中的文本。相反,UITextField可以接受用户输入的文本,例如在登录界面中,如果需要让用户输入用户名和密码,就可以使用UITextField。

打开BNRHypnosisViewController.m,修改loadView方法,向view中添加一个UITextField对象:

- (void)loadView

{

CGRect frame = [UIScreen mainScreen].bounds;

BNRHypnosisView *backgroundView =

[[BNRHypnosisView alloc] initWithFrame:frame];

CGRect textFieldRect = CGRectMake(40, 70, 240, 30);

UITextField *textField = [[UITextField alloc] initWithFrame:textFieldRect];

// 设置UITextField对象的边框样式,便于查看它在屏幕上的位置

textField.borderStyle = UITextBorderStyleRoundedRect;

[backgroundView addSubview:textField];

self.view = backgroundView;

}

构建并运行应用,Hypnotize标签页会显示一个文本框,该文本框就是刚才添加的UITextField对象。点击文本框,这时屏幕底部会弹出键盘,用于向文本框中输入文字。为了理解UITextField对象对点击事件的响应过程,下面需要介绍第一响应者(first responder)的概念。

UIResponder

UIResponder是UIKit框架中的一个抽象类。之前章节介绍过它的几个子类:

• UIView

• UIViewController

• UIApplication

UIResponder定义了一系列方法,用于接收和处理用户事件,例如触摸事件、运动事件(如摇晃设备)和功能控制事件(如编辑文本或播放音乐)等。UIResponder的子类会覆盖这些方法,实现自己的事件响应代码。

在以上事件中,触摸事件显然应该由被触摸的视图负责处理。系统会将触摸事件直接发送给被触摸的视图,第5章介绍过触摸事件的处理方法。

其他类型的事件则会由第一响应者负责处理,UIWindow有一个firstResponder属性指向第一响应者。例如,当用户点击UITextfield对象时,UITextfield对象就会成为第一响应者。UIWindow会将firstResponder指向该对象,之后,如果应用接收到运动事件和功能控制事件,都会发送给UITextfield对象(见图7-2)。

图7-2 第一响应者

当某个UITextField对象或UITextView对象成为第一响应者时,屏幕会弹出键盘。除了用户点击之外,还可以在代码中向UITextField对象发送becomeFirstResponder消息,使其成为第一响应者。相反,如果要关闭键盘,则可以向UITextField对象发送resignFirstResponder消息,且要求该对象放弃第一响应者状态。一旦第一响应者不是UITextField对象,键盘就会消失。

实际上,大部分视图都不需要成为第一响应者。例如UISlider对象,该对象只处理触摸事件(用户拖曳滑块),而不会接受其他类型的事件,因此它不需要成为第一响应者。

设置UITextField的键盘

UITextField对象有一系列属性,用于设置弹出的键盘。下面就修改这些属性,为UITextField对象添加占位符文本,并修改键盘的换行键类型。

- (void)loadView

{

CGRect frame = [UIScreen mainScreen].bounds;

BNRHypnosisView *backgroundView =

[[BNRHypnosisView alloc] initWithFrame:frame];

CGRect textFieldRect = CGRectMake(40, 70, 240, 30);

UITextField *textField = [[UITextField alloc] initWithFrame:textFieldRect];

// 设置UITextField对象的边框样式,便于查看它在屏幕上的位置

textField.borderStyle = UITextBorderStyleRoundedRect;

textField.placeholder = @/"Hypnotize me/";

textField.returnKeyType = UIReturnKeyDone;

[backgroundView addSubview:textField];

self.view = backgroundView;

}

构建并运行应用,现在UITextField对象中有一行占位符文本Hypnotize me,当用户在 UITextField对象中输入文字时,占位符文本就会消失。同时,换行键不再显示默认的Return,而是Done(见图7-3)。

图7-3 UIReturnKeyDone类型的键盘

但是,如果读者点击Done键,会发现应用没有任何反应。实际上,修改换行键的类型只是改变了换行键的外观,如果需要实现用户点击换行键后的功能,必须编写相应代码。在编写代码之前,再介绍UITextField对象中另外几个有用的属性: