Homepwner在显示BNRDetailViewController对象的视图时,系统显示的键盘会挡住子视图imageView,使用户无法看到完整的照片。下面为BNRDetailViewController实现委托方法textFieldShouldReturn:,使用户能通过按下“换行”键来取消UITextField对象的第一响应状态而关闭键盘(这也是为什么之前会为UITextField对象的插座变量delegate创建关联)。首先,在BNRDetailViewController.h中将BNRDetailViewController声明为遵守UITextFieldDelegate协议,代码如下:
@interface BNRDetailViewController ()
<UINavigationControllerDelegate, UIImagePickerControllerDelegate,
UITextFieldDelegate>
然后在BNRDetailViewController.m中实现textFieldShouldReturn:,代码如下:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
为了让Homepwner提供更佳的用户体验,需要在用户轻按BNRDetailViewController对象的视图的其他区域时,也能关闭键盘。向顶层视图发送endEditing:消息会使UITextField对象(顶层视图的子视图)取消第一响应状态而关闭键盘。下面要解决的问题是如何在用户按下视图时发送指定的消息。
前文曾经介绍过如何为UIButton这类对象设置目标-动作对,使其能够在被按下时,向指定的目标对象发送指定的动作消息。UIButton的这种目标-动作特性继承自父类UIControl。下面要将BNRDetailViewController对象的视图从UIView对象改为UIControl对象,使其能够处理触摸事件。
选中BNRDetailViewController.xib中的顶层视图。打开标识检视面板,将Class文本框中的UIView修改为UIControl(见图11-12)。
图11-12 修改BNRDetailViewController对象的视图的类
在辅助编辑器中打开BNRDetailViewController.m。按住Control键,从顶层视图开始(已经改为了UIControl)拖曳至BNRDetailViewController.m的方法实现区域。出现弹出窗口后,选择Connection下拉菜单中的Action。注意,这里的窗口和“创建并关联UIBarButtonItem时出现的窗口”略有不同。UIBarButtonItem对象是简化版本的UIControl,只能在被按下时向目标对象发送动作消息。而UIControl对象能够处理多种不同的事件,并发送相应的动作消息。
因为UIControl能够处理多种类型的事件,所以必须为要触发的动作消息设置合适的事件类型。对BNRDetailViewController对象的视图,因为要在用户按下视图时发送指定的动作消息,所以应该将事件类型设置为UIControlEventTouchUpInside(当手指在UIControl对象的bounds区域内离开屏幕时触发)。根据图11-13进行设置,然后点击Connect按钮。
图11-13 为UIControl对象设置动作关联
Xcode会在BNRDetailViewController.m中创建相应的空方法backgroundTapped:。将以下代码加入backgroundTapped:。
- (IBAction)backgroundTapped:(id)sender
{
[self.view endEditing:YES];
}
构建并运行应用,测试两种关闭键盘的途径。