美文网首页
iOS 02、退出键盘的六种方式

iOS 02、退出键盘的六种方式

作者: echo海猫 | 来源:发表于2017-06-23 09:47 被阅读104次

    当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;
    }
    

    总结一哈:个人在开发过程中遇到几次退出键盘操作了,所以作了一个总结,由于个人能力有限,理解和采用的实现方法可能不够完善,如有问题和疑问,可以评论沟通,谢谢,个人会努力学习,带来更好更有效地思想代码

    相关文章

      网友评论

          本文标题:iOS 02、退出键盘的六种方式

          本文链接:https://www.haomeiwen.com/subject/tcoqcxtx.html