iPhone:UITextField结束编辑事件不会隐藏键盘

时间:2012-02-28 16:44:39

标签: iphone keyboard uitextfield hide uitextfielddelegate

我想在UITextField结束编辑事件中隐藏键盘,但不知怎的,我无法使代码正常工作!当我按下完成按钮时,它会隐藏键盘,但是当我没有按完成按钮并移动到另一个UITextField我不需要键盘UIPickerView时。基本上UIPickerView出现在键盘后面。我正在结束当前UITextField结束编辑事件以及开始编辑所需的文本字段。如果我没有为之前的UITextField显示键盘,则开始编辑代码可以正常工作。有人可以告诉我,我做错了什么?

以下序列有效:

  1. 选择正常UITextField并插入文字,按完成按钮(此隐藏键盘)
  2. 选择选择器UITextField(显示选择器视图)
  3. ..但是关注不做:

    1. 选择普通UITextField并插入文字
    2. 选择选择器UITextField(选择器视图位于键盘后面,因为我没有按下之前UITextField的完成按钮)。这里它称为结束编辑,但它不会隐藏键盘!

      - (BOOL)textFieldShouldReturn:(UITextField *)textField {
          [textField resignFirstResponder];
          scrollView.contentSize = CGSizeMake(320, 750);
          [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
          return YES;
       }
      
      -(void)textFieldDidEndEditing:(UITextField *)textField  
      {
          [textField resignFirstResponder];
      }
      
      - (void)textFieldDidBeginEditing:(UITextField *)textField {
          DatePicker.hidden = YES;
          CountryPickerView.hidden = YES;
      
          switch (textField.tag) {
              case 3:
                  [textField resignFirstResponder];
                  DatePicker.hidden = NO;
                  return;
              case 6:
                  [textField resignFirstResponder];
                  CountryPickerView.hidden = NO;
                  return;
              default:
                  break;
          }
          scrollView.contentSize = CGSizeMake(320, 650);
          [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
      }
      

7 个答案:

答案 0 :(得分:10)

你不应该依赖标签而是指向对象,并从textFieldDidEndEditing中删除[textField resignFirstResponder];

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    if (textField == theTextFieldIDontWantKeyboardFor) {  
        [thepreviousTextField resignFirstResponder]; 
        return NO;
    }
    return YES; 
}

答案 1 :(得分:7)

  它隐藏了键盘,但是当我没有按下完成按钮并移动时却没有   到另一个uitextfield,我不需要键盘而是PickerView。

处理此问题的正确方法是为使用选择器而非键盘的字段设置inputView属性。根据需要配置选择器(设置委托,数据源等),然后将其设置为字段inputView。当您从一个字段移动到下一个字段时,系统将处理隐藏键盘并显示选择器视图,反之亦然。

答案 2 :(得分:3)

[yourTextField resignFirstResponder];

实际上是什么隐藏了键盘,所以当拾取器即将打开时使用它。

答案 3 :(得分:3)

当您将控件从一个文本字段切换到下一个文本字段而不进行重新调整时,textFieldDidBeginEditing不会被调用,因此,您需要通过将文本字段设置为“firstResponder”来重新对齐文本字段(因为它不是由于活动中的更改而不是firstResponder textfield)然后调用resignFirstResponder

答案 4 :(得分:1)

试试此代码

 -(void)textFieldDidEndEditing:(UITextField *)textField  
  {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

     //
  }
  else if(textField==pickerTextField){

  ///
  }
  }

  - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  if(textField==nameTextField){
    [nameTextField resignFirstResponder];

    //
  }
  else if(textField==pickerTextField){

  ///
  }
  }

答案 5 :(得分:0)

在此添加我的最终成果!

Valexa的解决方案。这非常好,但我需要手动处理不同的输入视图。

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [textField resignFirstResponder];
            scrollView.contentSize = CGSizeMake(320, 750);
            [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
        return YES;
    }

    - (void)textFieldDidBeginEditing:(UITextField *)textField {    
           previousTextField = textField;
           scrollView.contentSize = CGSizeMake(320, 650);
           [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
    }

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
           if (textField == CountryTextField || textField == BirthdayTextField) {
                  [previousTextField resignFirstResponder]; 
                  return NO; 
           }
          return YES; 
    }

惊人的解决方案(感谢Caleb):无需监控以前文本字段的额外变量,也无需显示和添加需求视图的头痛

BirthdayTextField.inputView = DatePickerView;
CountryTextField.inputView = CountryPickerView;
SexTextField.inputView = SexPickerView;

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
    scrollView.contentSize = CGSizeMake(320, 750);
    [scrollView setFrame:CGRectMake(0, 0, 320, 480)];
return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    scrollView.contentSize = CGSizeMake(320, 650);
    [scrollView setFrame:CGRectMake(0, 0, 320, 260)];
}

答案 6 :(得分:0)

-(void)hidekeybord
{
    [_txt_fname resignFirstResponder];
    [_txt_lname resignFirstResponder];
    [_txt_email resignFirstResponder];
    [_txt_phoneN resignFirstResponder];
    [_txt_dateofbd resignFirstResponder];
    [_txt_address resignFirstResponder];
    [_txt_city resignFirstResponder];

}

- (IBAction)btn_open_datepiker:(id)sender
{
    [self hidekeybord];

    _datepiker_bd.hidden=FALSE;
    _toolbar_db.hidden=FALSE;


}