欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

代码详解ios键盘收起问题

程序员文章站 2024-02-11 17:54:28
在开发过程中,我们经常会用到uitextfield、uitextview等文本框,然后这些文本框在点击之后会自动成为第一响应者(firstresponder),并自动弹出软...

在开发过程中,我们经常会用到uitextfield、uitextview等文本框,然后这些文本框在点击之后会自动成为第一响应者(firstresponder),并自动弹出软键盘。然而,没有自动定义好的软键盘的回收。今天,我在开发过程中就遇到了这个问题,首先,软键盘收起会发生在两种情况下,一是当前区域为非第一响应者,二是当前区域的输入结束。具体解决方案有两种:

1、在当前页面设置点击事件,当点击事件发生时,注销当前视图的第一响应者或者设置当前摄入结束。当点击事件发生在非选中区域时,则键盘会自动回收:

//在viewdidload中 添加点击手势,为了关闭键盘的操作
uitapgesturerecognizer *tap1 = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(viewtapped:)];
tap1.cancelstouchesinview = no;
[self.view addgesturerecognizer:tap1];
//点击空白处的手势要实现的方法,设置当前输入结束
-(void)viewtapped:(uitapgesturerecognizer*)tap1
{
  [self.view endediting:yes]; 
}

这种方法对于视图上的任何uitextfield、uitextview等文本框都有效,不需要对每一个uitextfield、uitextview等文本框进行进行设置。

2、利用键盘上的 回车键 来进行设置当前uitextfield、uitextview等文本框不是第一响应者,这种方法对uitextfield、uitextview的应用不一样,需要区别进行。

对于uitextfield,相应的uitextfielddelegate有相关的处理

//设置回车键的类型和代理
self.themetextfield.returnkeytype = uireturnkeydone;
self.themetextfield.delegate = self ;
#pragma mark - textfield delegate
- (bool)textfieldshouldreturn:(uitextfield *)textfield {
  [textfield resignfirstresponder];
  //[self.view endediting:yes];
  return yes;
}

对于uitextview,相应的uitextviewdelegate并没有相应的处理回车键的方法。但是,我们可以根据uitextviewdelegate提供的方法对键盘输入的值进行判断,如果为回车键(\n)则设置当前uitextview不是第一响应者,否则不操作。

//设置回车键的类型和代理,当前类是继承自uitextview的一个类 
self.delegate = self ; 
self.returnkeytype = uireturnkeydone ;
//uitextviewdelegate代理,当键盘输入变化时调用,可以通过该方法判断输入的内容
- (bool)textview:(uitextview *)textview shouldchangetextinrange:(nsrange)range
 replacementtext:(nsstring *)text
{
  //判断是否是回车键
  if ([text isequaltostring:@"\n"]) {
    [textview resignfirstresponder];
    return no;
  }
  return yes ;
}