在开发中通常会遇到一些需要输入信息相关的需求,那么就会调用到键盘来录入信息,但录入完毕键盘控件的回收问题从而随之而来;

通过巧妙的回收键盘控件可以大大的提高用户的体验效果,主要都是围绕 touch 事件和一些控件的代理监听方法展开实现操作;

接下来我们可以通过如下几种事件方式根据当前需求进行使用.

一.提到录入信息,通常优先会想到 UITextView 和 UITextField

    使用如上两种控件录入是日常中最为常见的,那么将控件设置好自己相关的代理后,便可以实现对键盘的相关监听处理操作;

    首先需要将控件进行实例化,其次通过调用它们各自的代理方法来执行对键盘的具体处理操作.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@"\n"]) {
        [textViewUser resignFirstResponder];
        return NO;
    }
    return YES;
}


注:首先需要在 interface 中引用对应控件的代理(例如:UITextFieldDelegate, UITextViewDelegate),并将代理指向至当前控件.



二.点击录入区域外的区域_1

    当调用控件录入信息完毕后,点击录入和键盘之外任意区域即可将键盘收起,使得很自然的提升用户体验效果;

    可以通过 Touch 事件来实现该原理,具体实现 code 如下:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (![textViewPwd isExclusiveTouch]) {
        [textViewPwd resignFirstResponder];
    }
}

三.点击录入区域外的区域_2

    该方法与上面第二项中的类似,但区别在于事件触发原理不同;

    上者为通过 Touch 事件响应的原理;

    则该方法中介绍的则是通过 UIController 的 Touch Up Inside 绑定点击事件来进行实现收起的效果;

    具体代码实现如下:

- (IBAction)dismissKeyboard:(id)sender {
    [textViewPhone resignFirstResponder];
}


注:该项中和第二项中所要执行的操作都要确保为当前图层中,即 UIController 或 UIView.


四.自定义按钮事件

    当外界没有可供借用的资源时,可以考虑通过自定义按钮并绑定其事件从而达到收起键盘的操作;

    其中需要利用通知来辅助完成,具体操作如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(doneButtonshow:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];//注册通知,进行监听当前状态
}
#pragma mark - 具体响应事件相关
- (void)hideBtnshow:(NSNotification *)notification {
    hideBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    hideBtn.frame = CGRectMake(20, 80, 60, 44);
    [hideBtn setTitle:@"完成" forState:UIControlStateNormal];
    [hideBtn addTarget:self
                action:@selector(hideKeyboard)
      forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:hideBtn];
}
- (void)hideKeyboard {// 按钮事件所需执行的操作
    [hideBtn removeFromSuperview];
    [textViewPwd resignFirstResponder];
}
- (void)dealloc {//移除当前通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}