endEditing

问题

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

1 [textField resignFirstResponder]

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

01 #import "FormViewController.h"
02  
03 @interface FormViewController ()<UITextFieldDelegate>
04  
05 @property (weak, nonatomic) IBOutlet UITextField *textFieldA;
06 @property (weak, nonatomic) IBOutlet UITextField *textFieldB;
07 @property (weak, nonatomic) IBOutlet UITextField *textFieldC;
08 @property (weak, nonatomic) IBOutlet UITextField *textFieldD;
09 @property (weak, nonatomic) IBOutlet UITextField *textFieldE;
10 @property (weak, nonatomic) IBOutlet UITextField *textFieldF;
11 @property (weak, nonatomic) IBOutlet UITextField *textFieldG;
12 @property (weak, nonatomic) IBOutlet UITextField *textFieldH;
13 @property (weak, nonatomic) IBOutlet UITextField *textFieldI;
14  
15 @property (weak , nonatomic) UITextField *editingTextField ; // 跟踪当前处于编辑状态的textfield
16  
17 @end
18 @implementation FormViewController
19 @synthesize textFieldA,textFieldB,textFieldC,
20             textFieldD,textFieldE,textFieldF,textFieldG,textFieldH,
21             textFieldI,editingTextField;
22 - (void)viewDidLoad
23 {
24     [super viewDidLoad];
25     self.textFieldA.delegate = self ;
26     self.textFieldB.delegate = self ;
27     self.textFieldC.delegate = self ;
28     self.textFieldD.delegate = self ;
29     self.textFieldE.delegate = self ;
30     self.textFieldF.delegate = self ;
31     self.textFieldG.delegate = self ;
32     self.textFieldH.delegate = self ;
33     self.textFieldI.delegate = self ;
34      
35 }
36 - (void)viewDidUnload {
37     [self setTextFieldA:nil];
38     [self setTextFieldB:nil];
39     [self setTextFieldC:nil];
40     [self setTextFieldD:nil];
41     [self setTextFieldE:nil];
42     [self setTextFieldF:nil];
43     [self setTextFieldG:nil];
44     [self setTextFieldH:nil];
45     [self setTextFieldI:nil];
46     [self setEditingTextField:nil];
47     [super viewDidUnload];
48 }
49 // UITextFieldDelegate 方法
50 - (void)textFieldDidBeginEditing:(UITextField *)textField
51 {
52     self.editingTextField = textField ;
53 }
54 // 提交Action
55 - (IBAction)submitForm:(UIBarButtonItem *)sender
56 {
57     [self.editingTextField resignFirstResponder];
58     // 提交表单,弹出提示等待框,略
59 }

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

1 [self.editingTextField resignFirstResponder];

来关闭键盘。

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

1 self.textFieldA.delegate = self ;
2 self.textFieldB.delegate = self ;
3 self.textFieldC.delegate = self ;
4 self.textFieldD.delegate = self ;
5 self.textFieldE.delegate = self ;
6 self.textFieldF.delegate = self ;
7 self.textFieldG.delegate = self ;
8 self.textFieldH.delegate = self ;
9 self.textFieldI.delegate = self ;

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


endEditing:

说了半天终于开始讲到重点了,下面介绍下endEditing:方法,该方法为UIView中的一个方法,定义为 
1 - (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下,我们 
只要调用  
1 [self.view endEditing:YES];
键盘立马关闭! 

<think>好的,我现在需要帮助用户解决在Swift中如何让UITextField弹出的键盘消失的问题。首先,我需要回忆一下Swift中处理键盘消失的常见方法。记得通常有两种方式:一种是让用户点击键盘上的返回键时关闭键盘,另一种是用户点击屏幕其他区域时关闭键盘。 然后,我需要考虑用户的具体需求。用户提到的是在输入数字后完成输入时关闭键盘,可能需要通过点击返回键或者完成按钮来实现。这时候,应该使用UITextFieldDelegate中的textFieldShouldReturn方法,当用户点击返回键时调用resignFirstResponder()来隐藏键盘。 另外,用户可能还想知道如何通过点击屏幕其他地方来关闭键盘,这需要覆盖视图控制器的touchesBegan方法,或者在视图中添加一个手势识别器。例如,添加一个UITapGestureRecognizer,当检测到点击时让所有的textField放弃第一响应者状态。 接下来,我需要检查用户提供的引用内容,看看有没有相关的信息。引用[1]提到设置UITextFieldDelegate,这可能与实现textFieldShouldReturn方法有关。引用[4]提到不能同时设置某些属性,但这里的问题不涉及这些属性,所以暂时不需要担心冲突。 需要确保回答的结构清晰,分步骤说明两种方法,并给出示例代码。同时,需要提醒用户设置delegate的正确位置,比如在viewDidLoad中将textField的delegate设为self,并且视图控制器需要遵循UITextFieldDelegate协议。 可能还需要注意代码中的正确语法,比如使用@IBAction或者@objc修饰手势识别器的方法,特别是在Swift中处理事件时需要这些修饰符。此外,要确认示例代码的正确性,例如在touchesBegan方法中调用view.endEditing(true)是否有效,或者是否需要使用手势识别器。 最后,生成相关问题的时候,要围绕UITextField的其他常见问题,比如输入限制、布局问题或者自定义视图,这样可以帮助用户进一步解决问题。</think>在Swift中让UITextField的键盘消失,可以通过以下两种常见方法实现: ### 方法一:点击键盘Return键关闭 1. **遵循协议**:在UIViewController中声明遵循`UITextFieldDelegate` 2. **设置代理**:将`textField.delegate = self` 3. **实现方法**:在`textFieldShouldReturn`中调用`resignFirstResponder()` ```swift class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.delegate = self } func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } } ``` ### 方法二:点击空白区域关闭 通过添加手势识别器或覆盖`touchesBegan`方法: ```swift // 方式1:添加点击手势 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) view.addGestureRecognizer(tapGesture) @objc func dismissKeyboard() { view.endEditing(true) } // 方式2:覆盖触摸事件 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { view.endEditing(true) } ``` ### 注意事项 1. 对于数字键盘,需设置`textField.returnKeyType = .done`使其显示完成按钮 2. 确保视图控制器已正确关联代理(如未使用Storyboard需手动设置) 3. 如果同时处理多个TextField,可通过`view.endEditing(true)`统一关闭所有键盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值