iOS键盘处理

键盘处理
一.常用属性及方法
// 文本框聚焦, 弹出键盘 
- (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;
}
原文地址:https://www.cnblogs.com/orzmj123/p/3497534.html