键盘处理 一.常用属性及方法 // 文本框聚焦, 弹出键盘 - (BOOL)becomeFirstResponder; // 文本框失焦,退出键盘 - (BOOL)resignFirstResponder; // 一次性退出任何键盘 [self.view endEditing:YES]; // 自定义键盘 @property (readwrite, retain) UIView *inputView; // 自定义键盘顶部显示工具条 @property (readwrite, retain) UIView *inputAccessoryView; // 设置代理步骤 UITextField的代理对象用来控制和监听文本框的输入 1> 设置代理对象 2> 遵守协议 3> 实现代理方法 UITextField代理方法: // 当文本框开始获得焦点的时候调用 - (void)textFieldDidBeginEditing:(UITextField *)textField; // 当用户失去焦点的时候调用 - (void)textFieldDidEndEditing:(UITextField *)textField; // 在文本框准备聚焦的时候调用,返回NO代表不允许聚焦(编辑) - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; // 在文本框准备失去焦点(退出键盘)的时候调用,返回YES代表允许退出键盘 - (BOOL)textFieldShouldEndEditing:(UITextField *)textField; // 在用户每次输入的时候都会调用,返回YES代表允许输入, 返回NO,代表禁止改变文本框的文字(不能增加、删除文字) - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string // 点击了键盘右下角的按钮就会调用(return key) - (BOOL)textFieldShouldReturn:(UITextField *)textField; 二.递归遍历视图中所有文本框 - (void)isTextField:(UIView *)view { if (view.subviews.count == 0) return; for (UIView * child in view.subviews) { if ([child isKindOfClass:[UITextField class]]) { // insert your code here... } else { [self isTextField:child]; } } } 三、监听键盘的显示和隐藏 1.监听键盘通知 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];// 单例 // 1.显示键盘 [center addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; // 2.隐藏键盘 [center addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 2.移除键盘通知(非ARC比做操作) - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } 3.注意:当弹出一个新的键盘时,才会发出显示键盘的通知 四、关闭键盘方法 #pragma mark 关闭键盘方法1 [self.view endEditing:YES]; // 成功关闭键盘的条件:self.view或者其子视图是第一响应者 #pragma mark 关闭键盘的方法2 // 递归找到第一响应者,让它把键盘给退回去 [[self findFirstResponder:self.view] resignFirstResponder]; - (UIView*)findFirstResponder:(UIView*)view { for ( UIView *childView in view.subviews ) { // 遍历子视图 if ( [childView respondsToSelector:@selector(isFirstResponder)] && [childView isFirstResponder] ) { return childView; // 如果childView是第一响应者 } UIView *result = [self findFirstResponder:childView]; if (result) return result; } return nil; }