首先打开第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对象中另外几个有用的属性: