当UITextFeild和UITextView处于编辑界面时,这些控件成为了键盘的“第一响应者”。要编辑键盘就要放弃第一响应者的身份。在iOS中,事件沿着响应者链从一个响应者传到另一个响应者,如果其中一个响应者没有对事件做出响应,那么该事件会重新向下传递。顾名思义,"第一响应者"是响应者链的第一个,不同的控件成为“第一响应者”之后的“表现”不太一样,UITextFeild和UITextView等输入类型的控件会出现键盘,而当我们放弃“第一响应者”的身份后,键盘才可以关闭。
综上是对退出键盘原理的阐述,接下来我们对处理键盘的退出方式做一个简单的介绍:
前提:工程中的变量和属性的声明没有提供,实现代码仅供参考用于提供开发思想
// self.backKeyText为控制器中键盘的全局属性
//(1)、手势退出:当我们开发过程中不再需要使用虚拟键盘时,只需点击虚拟键盘和编辑区域外的地方,就可以将弹出的虚拟键盘收起(采用touchesBegan: withEvent: 方法)
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event
{
[self.backKeyText resignFirstResponder];
}
//(2)、return键(换行键)退出键盘:第二种方式就是当我们开发过程中不再需要使用虚拟键盘时,只需点击return键或者换行键,就可以将弹出的虚拟键盘隐藏
//点击return 按钮 去掉
//此时也可以利用tag属性将self.backKeyText设为第一响应者(例如self.backKeyText.tag = 1000),判断如果tag不为1000时键盘不作弹出和退出响应
-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.backKeyText resignFirstResponder];
return YES;
}
//(3)、UIControl Event TouchUpInside,进行连接设置IBAction在方法中写[self.backKeyText resignFirstResponder] 也可实现退出键盘的操作
//(4)、在viewDidLoad中利用NSNotificationCenter 进行注册隐藏键盘的实现方法,在键盘弹出后显示退出键盘的按钮,在按钮的方法中执行隐藏键盘,这个方法提供参考
//viewDidLoad添加的代码为:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (hideKeyboardBtnShow:) name: UIKeyboardDidShowNotification object:nil];
//设置隐藏键盘按钮显示的实例方法
-(void)hideKeyboardBtnShow:( NSNotification *)notification {
hideBtn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
hideBtn.frame = CGRectMake(150, 300, 40, 40);
[hideBtn setTitle:@"退出键盘" forState: UIControlStateNormal];
[hideBtn addTarget: self action:@selector(hideKeyboard) forControlEvents: UIControlEventTouchUpInside];
[self.view addSubview:hideBtn];
}
//隐藏键盘的实现调用方法
-(void)hideKeyboard {
[self.backKeyText resignFirstResponder];
[hideBtn removeFromSuperview];
}
//释放NSNotificationCenter,Observer不能为空
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
//(5) 、UITextField和UITextView有一个inputAccessoryView的属性,当你想在键盘上展示一个自定义的view时去退出键盘时,可以设置该属性。你设置的view就会自动和键盘keyboard一起显示了。像是在数字键盘这种无return换行字元时,又不太方便设置手势处理,那么我们还可以通过自定义UIToolBar创建一个View添加到键盘上部分,设置一个按钮,添加退出键盘的实例方法,然后在把这个View直接赋值给inputAccessoryView也可完成操作
//注意:自定义的view只需要赋给属性inputAccessoryView就可以了,不要再做其他多余的操作因为这个自定义的view不在其他视图或者其他子视图中;但是inputView是全部覆盖键盘,如果采用inputView则无法弹出键盘,需按照自己的需求做选择使用
//具体代码如下:
UIToolbar *hideKeyboardView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, width, 44)];
UIButton *hideKeyboardBtn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
hideKeyboardBtn.frame = CGRectMake(width-50, 10, 50, 20);
[hideKeyboardBtn setTitle:@"完成" forState: UIControlStateNormal];
[hideKeyboardBtn addTarget: self action:@selector(hideKeyboard) forControlEvents: UIControlEventTouchUpInside];
[hideKeyboardView addSubview:hideKeyboardBtn];
[self.backKeyText setInputAccessoryView:hideKeyboardView];
// 此方法和(1)均用textField代理方法去做的处理,所以类似的textView退出键盘的操作也可采用代理的方式进行处理退出键盘的操作
//(6)、实现textField的代理方法:此方法是判断当键盘的内容发生变化时,是不是应该用输入的string添加到到键盘中,判断如果按的是回车键,判断输入的字符为\n,代码做放弃第一响应者身份的操作,退出键盘
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(nonnull NSString *)string
{
if ([string isEqualToString:@"\n"]) {
[self.backKeyText resignFirstResponder];
return NO;
}
return YES;
}
总结一哈:个人在开发过程中遇到几次退出键盘操作了,所以作了一个总结,由于个人能力有限,理解和采用的实现方法可能不够完善,如有问题和疑问,可以评论沟通,谢谢,个人会努力学习,带来更好更有效地思想代码