文档章节

UIView之endEditing方法

big军
 big军
发布于 2013/01/05 10:34
字数 1065
阅读 13742
收藏 3

问题

《IOS 键盘的显示和关闭》 一篇介绍了键盘的显示与关闭的原理流程性的东西,在关闭如果当前我们正在在textField上输入文本的话,我们只要做如下操作

[textField resignFirstResponder]

即可将键盘关闭,但随之问题也就出现了,假如考虑我们现在在应用中包含一了表单模块,要求填完表单之后我们要将数据进行保存,该表单可能包含了十几个UITextField对应的数据 输入项。此外包含了一个“提交”按钮,点击提交数据发送后台的过程中,我们要弹出一个简单的提交等待弹出框告知用户等待。整个流程并不复杂,但是涉及到了一个UI显示细节问题,即: 在用户等待的过程中键盘可能一直处于显示状态,虽然可能被弹出框的遮罩遮住,也许可能有些人不介意,但个人感觉正确正确的显示状态是,在点击提交数据后,紧接着是马上关闭键盘, 然后显示等待弹出框。因此,这涉及到要跟踪当前处于First Responder状态的UITextField对象,好让我们在提交的action中调用其resignFirstResponder方法关闭键盘,这 是我们可能直观上首先想到的问题的解决办法,的确,这也是最直观的。通常在IOS的MVC设计中,一个模块往往会对应一个UIViewController,假设我们的表单提交对应的Controller名为 FormViewController,我们可以用如下代码来简单解释以上处理流程:

#import "FormViewController.h"

@interface FormViewController ()<UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *textFieldA;
@property (weak, nonatomic) IBOutlet UITextField *textFieldB;
@property (weak, nonatomic) IBOutlet UITextField *textFieldC;
@property (weak, nonatomic) IBOutlet UITextField *textFieldD;
@property (weak, nonatomic) IBOutlet UITextField *textFieldE;
@property (weak, nonatomic) IBOutlet UITextField *textFieldF;
@property (weak, nonatomic) IBOutlet UITextField *textFieldG;
@property (weak, nonatomic) IBOutlet UITextField *textFieldH;
@property (weak, nonatomic) IBOutlet UITextField *textFieldI;

@property (weak , nonatomic) UITextField *editingTextField ; // 跟踪当前处于编辑状态的textfield

@end
@implementation FormViewController
@synthesize textFieldA,textFieldB,textFieldC, 
            textFieldD,textFieldE,textFieldF,textFieldG,textFieldH, 
            textFieldI,editingTextField; 
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.textFieldA.delegate = self ;
    self.textFieldB.delegate = self ;
    self.textFieldC.delegate = self ;
    self.textFieldD.delegate = self ;
    self.textFieldE.delegate = self ;
    self.textFieldF.delegate = self ;
    self.textFieldG.delegate = self ;
    self.textFieldH.delegate = self ;
    self.textFieldI.delegate = self ;
    
}
- (void)viewDidUnload {
    [self setTextFieldA:nil];
    [self setTextFieldB:nil];
    [self setTextFieldC:nil];
    [self setTextFieldD:nil];
    [self setTextFieldE:nil];
    [self setTextFieldF:nil];
    [self setTextFieldG:nil];
    [self setTextFieldH:nil];
    [self setTextFieldI:nil];
    [self setEditingTextField:nil];
    [super viewDidUnload];
}
// UITextFieldDelegate 方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    self.editingTextField = textField ;
}
// 提交Action
- (IBAction)submitForm:(UIBarButtonItem *)sender
{
    [self.editingTextField resignFirstResponder];
    // 提交表单,弹出提示等待框,略
}

这里FormViewController首先实现了UITextFieldDelegate协议,在viewDidLoad的时候,让所有textField的delegate都指向FormViewController,并且添加了editingTextField属性用于保存当前处于编辑状态下的textField对象,具体的跟踪方法是在在textFieldDidBeginEditing:代理方法中实现,这样在submitForm时,我们边可以调用

[self.editingTextField resignFirstResponder];

来关闭键盘。

流程上逻辑很简单,但总感觉只为实现关闭键盘这个功能,需要添加

self.textFieldA.delegate = self ;
    self.textFieldB.delegate = self ;
    self.textFieldC.delegate = self ;
    self.textFieldD.delegate = self ;
    self.textFieldE.delegate = self ;
    self.textFieldF.delegate = self ;
    self.textFieldG.delegate = self ;
    self.textFieldH.delegate = self ;
    self.textFieldI.delegate = self ;

这一坨的重复代码,总感觉不爽。而且如果表单中出现多个UITextView的话,岂不是还要重复以上逻辑?


endEditing:

说了半天终于开始讲到重点了,下面介绍下endEditing:方法,该方法为UIView中的一个方法,定义为
- (BOOL)endEditing:(BOOL)force
官网文档释义:
Causes the view (or one of its embedded text fields) to resign the first responder status.
This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.

大意为:
注销当前view(或它下属嵌入的text fields)的first responder 状态。
该方法会在当前view以及其subview层次结构中需找当前处于first responder状态的text field。如果找到的话会注销其first responder状态,如果指定force参数为YES,则不再询问text field,而直接强制注销其first responder状态。

好了,有了这个快捷方法,在FormViewController中,则不需要在实现UITextFieldDelegate,来对处于编辑状态的textField进行跟踪,也不必担心将来会添加N个UITextView,只要是在FormViewController下,我们
只要调用 
[self.view endEditing:YES];
键盘立马关闭!


注:描述于IOS5.1下

© 著作权归作者所有

共有 人打赏支持
big军
粉丝 35
博文 54
码字总数 90542
作品 0
浦东
程序员
私信 提问
加载中

评论(1)

狂奔的小蚂蚁
狂奔的小蚂蚁
谢谢分享,学习了,解决了我的问题。
iOS笔记:通过hitTest:withEvent:隐藏键盘

目前最简单和直接的隐藏键盘的方法,通过覆盖hitTest:withEvent:方法并调用endEditing:方法来隐藏键盘。 先上代码 @implementation ALXBackgroundView - (UIView )hitTest:(CGPoint)point wi...

luan.ma
2014/06/25
0
0
iOS ---UIView的hitTest:方法和pointInside:

先是基本概念分析 - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { } 这个函数的用处是判断当前的点击或者触摸事件的点是否在当前的view中。 它被hitTest:withEvent:调用,...

-Man
2015/11/26
179
0
键盘通知keyboard,获取键盘高度进行操作

iOS博主造了个轮子,引入.h就可以自动偏移view,防止界面被键盘遮挡 -------------------分割线------------------- 博客更新,使用新的方法 [[NSNotificationCenter defaultCenter] addObserve...

iShown
2016/02/26
0
0
tableView使用的各项注意点

1.取消tableView上的分割线。 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 2.设置cell的选中样式。 self.selectionStyle = .None 3. 设置cell滑动 出现 删除的按钮......

如若初见
2016/04/25
48
0
iOS UITextField 使用与方法解读

UITextField是IOS开发中用户交互中重要的一个控件,常被用来做账号密码框,输入信息框等。 初始化一个文字框: 设置和获取文字框文字: @property(nonatomic,copy) NSString *text; 通过Att...

珲少
2015/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot项目如何访问jsp页面

1.添加pom依赖 首先在原来的pom文件基础上加上这两个配置 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:7877071...

编程SHA
23分钟前
3
0
nginx反向代理配置去除前缀

使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:...

架构师springboot
55分钟前
5
0
QianBill API 开发笔记

JWT

BeanHo
今天
5
0
Elasticsearch实战篇——Spring Boot整合ElasticSearch

当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来探讨Spring Boot整合ElasticSearch的问题。 本文主要讲以下内容: 第一部分,通...

JAVA_冯文议
今天
4
0
不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7...

sprouting
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部