iOS—收起虚拟键盘的各种方法 - 向日葵的倔强天空

时间:2024-03-18 08:15:19

iOS—收起虚拟键盘的各种方法

本文章转自—http://justcoding.iteye.com/blog/1476171

     使用虚拟键盘来输入资讯,是iOS的重要互动方式之一,虚拟键盘通常会自动出现在可以编辑的UITextField或是 UITextView 的编辑事件中,叫出键盘固然容易,但是要把它收起来,可就没有这么简单,之前在 UITextField 输入结束后的收起小键盘的方式一文中,介绍了如何在编辑完成之后收起虚拟键盘,但是如果您的元件并没有对应的事件可以让你收起虚拟键盘,那又该如何做?下列我们以类似的元件 UITextView 为例,介绍一些通用的方法。

1.点击编辑区以外的地方(UIView)

这是一种很直接的方法,当不再需要使用虚拟键盘的时候,只要点击虚拟键盘和编辑区域以外的地方,就可以将键盘收起,下面程式码是在UIView中内建的触碰事件方法函数。

 c代码

1 -(void)toucheEnded:(NSSet *)touches withEvent:(UIEvent *)event{
2     if(![myTextView isExclusiveTouch]){
3     [myTextView resignFirstResponder];  
4     }  
5 }


如果要使用此方式请务必记得,你操作画面的 Custom Class 一定是UIView才行。画面的Custom Class 为 UIView

2.点击编辑区域意外的地方(UIControl)

收起虚拟键盘的方式与前一种相同,但是如果你的触碰事件里已经且写满了程式码,那么就可以考虑使用,UIControl的Touch Up Inside 事件来收起键盘,方法是将以下程式码与UIcontrol的Touch Up Inside事件连结即可。

c代码

1 -(void)dismissKeyboard:(id)sender{
2 
3   [myTextView resignFirstResponder]; 
4 
5 }

如果要使用此方式,请务必记得,你操作画面的Custom Class 一定要是 UIControl 才行,将收起键盘的方法与UIControl事件连结

3.使用只做收起键盘的按钮

当没有编辑区域以外的地方可供点击来收起键盘,自己制作一个按钮来收起目前的虚拟键盘,也是一个不错的方法,由于按钮必须在虚拟键盘出现才能显示于画面上, 因此必须借用NSNotificationCenter 来帮助我们判断目前键盘的状态,您可以在类似 Observer Pattern 的 NSNotificationCenter 一文中,找到更多关于 NSNotificationCenter 的资讯。

  首先在 viewDidLoad: 事件中,向 NSNotificationCenter 进行註册,告诉 NSNotificationCenter 我们的 doneButtonshow: 方法函式,想要订阅有关 UIKeyboardDidShowNotification 的讯息事件。

c代码

1 -(void)viewDidLoad{
2   [super viewDidLoad];
3 
4   [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonshow:) name: UIKeyboardDidShowNotification object:nil];  
5 }  

现在每当虚拟键盘出现时,就会自动呼叫我们自定义的doneButtonshow:方法函数,接下来只要在刚方法函数里定义按钮出现的方法即可。

c代码

1 -(void)doneButtonshow:(NSNotification *)notification
2 {
3  doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
4  doneButton.frame = CGRectMake(0,228,70,35);
5  [doneButton setTitle:@"完成编辑" forState:UIControlStateNormal];
6  [doneButton addTarget:self action:@selector(hideKeyboard)  forControlEvents:UIControlEventTouchUpInside];
7  [self.view addSubview:doneButton];
8 }

最后是实作按钮按下去时的hideKeyboard:方法函数,务必记得要在函数中移除该按钮。

c代码

1 -(void)hideKeyboard
2 {
3   [doneButton removeFromSuperview];
4   [myTextView resignFirstResponder];
5 }

4.使用判断段输入字元

如果要使用输入特定字元(例如return换行字元)来收起键盘,必须现在类别内的 @interface区段采用协定。

在采用协定之后,接着实作出协定内的textView:shouldChangeTextInRange:replacementText:方法,此方法函数会在字元输入时触发,而回传的BOOL值则代表该字元是否要作用,下列程式码就是在此方法函数中,使用判断输入字元的方法来收起虚拟键盘(判断字元为return换行字元).

c代码

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

最后别忘记在viewDidLoad:事件中,将UITextView的代理事件指向自己,这样程式才能正确找到实作协定方法函式的类别。

c代码

1 -(void)viewDidLoad
2 {
3   [super viewDidLoad];
4   myTextView.delegate = self;
5 }