【问题标题】:iPhone: UITextField End Editing event doesn't hide keyboardiPhone:UITextField 结束编辑事件不隐藏键盘
【发布时间】:2012-03-18 04:01:18
【问题描述】:

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

以下顺序有效:

  1. 选择普通UITextField并插入文本,按完成按钮(这会隐藏键盘)
  2. 选择选择器UITextField(这会显示选择器视图)

..但以下没有:

  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)];
    }
    

【问题讨论】:

  • 嗨 Celeb,我在 stackoverflow 上解决了所有关于隐藏 uitextfield 键盘的类似问题,但没有一个与隐藏键盘和显示其他内容有关(在我的情况下是 uipicker)。每个人都说它只是调用 resignFirstResponder 但在我的情况下,让它工作的逻辑有点不同。我已经发布了一个解决方案。感谢 Valexa!
  • 不需要添加问题的解决方案。实际上,如果您想回答自己的问题,正确的做法是将其写在答案中。

标签: iphone keyboard uitextfield hide uitextfielddelegate


【解决方案1】:

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

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

【讨论】:

  • 嗨 Valexa,我添加了它来隐藏键盘!如果我删除,那么它也不起作用!
  • 我这样做是因为我没有选择文本字段,因为我希望用户从 Picker 视图中选择值!如果我从开始编辑中删除,那么键盘肯定会出现,这是我不想要的。我错过了什么明显的东西吗?
  • @velexa buddy 我已经花了很多时间来解决这个问题并弄清楚事件序列是什么等等,但无法解决这个问题。一个简单的问题是当您切换到其他文本字段而不按完成按钮并且不显示新选择的文本字段的键盘时如何关闭键盘?
  • 哈哈哈......我们回到广场......这是我尝试的第一个解决方案!我将该代码保留在结束编辑事件中,但不起作用!
  • 无论我做什么,这似乎都是苹果的秘密!你能试试这个简单的代码!很有趣!
【解决方案2】:

它会隐藏键盘,但当我不按完成按钮并移动时不会 到另一个我不需要键盘但 PickerView 的 uitextfield。

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

【讨论】:

  • 您能否通过显示一些代码来详细说明一下?
  • @GaneshGuturi 哪一部分不清楚?请记住,这个问题已经有将近 5 年的历史了。
【解决方案3】:
[yourTextField resignFirstResponder];

是实际隐藏键盘的东西,所以在选择器即将打开时使用。

【讨论】:

  • 我在结束编辑时使用这种方法!它不会隐藏键盘...当我按下完成按钮时,我在 textFieldShouldReturn 中使用相同的方法(隐藏键盘)!
  • 方法 textFieldDidEndEditing 在键盘已经消失后被调用,所以在这个方法中告诉它消失是没有意义的。
【解决方案4】:

当您将控制从一个文本字段切换到下一个而不辞职时,textFieldDidBeginEditing 不会被调用,因此您需要通过将其设为“firstResponder”来辞职文本字段(因为它不是 firstResponder 由于活动文本字段的变化)然后打电话给resignFirstResponder

【讨论】:

  • 我要辞去第一个编辑文本的人!我已经确认,当我在没有按下 done 的情况下切换到另一个文本字段时,事件序列是“首先结束编辑”、“首先辞职”、“第二次开始编辑”……在我辞去第一响应者但仍然键盘的每个地方都不是消失!!!
【解决方案5】:

试试这个代码

 -(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){

  ///
  }
  }

【讨论】:

  • 这就是我的代码的作用!它在最终编辑中不起作用,但在 textFieldShouldReturn 中起作用!
  • 这个答案不正确。 textFieldDidEndEditing 仅在 UITextField 已经关闭键盘时调用。
【解决方案6】:

在这里添加我的最终结果!

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)];
}

【讨论】:

    【解决方案7】:
    -(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;
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      相关资源
      最近更新 更多