如何获取当前活动的UITextField / UITextView和resignFirstResponder?

时间:2012-01-22 05:02:49

标签: iphone ios cocoa-touch uiview

是否可以在UIView中获取当前活动的UITextField或UITextView,这样我可以用[text resignFirstResponder];隐藏键盘?

6 个答案:

答案 0 :(得分:27)

从iOS 2.0及更高版本开始,有一种简单的方法可以在不必跟踪当前活动控件或迭代所有可用控件或使用UITextFieldDelegate的情况下关闭键盘。

[self.view endEditing:YES]

来自文档:

  

endEditing:

     

使视图(或其中一个嵌入的文本字段)成为   辞去第一响应者的身份。

       - (BOOL)endEditing:(BOOL强制

     

<强>参数
  
  指定YES以强制第一响应者辞职,无论其是否愿意   所以。

  返回值
  YES如果视图已退出第一响应者状态,或NO如果不是。{

     

<强>讨论
  此方法查看当前视图及其子视图   当前第一个响应者的文本字段的层次结构。如果   它找到一个,它要求文本字段作为第一响应者辞职。如果   force参数设置为YES,文本字段永远不会被询问;   它被迫辞职。

答案 1 :(得分:5)

没有办法直接获取当前第一响应者(至少我知道)的对象而不单独测试它们。你可以做的是创建一个包含所有子视图的方法,这些子视图可能是主动的第一响应者,如下所示:

- (void)dismissKeyboard {
    if (myTextField1.isFirstResponder) {
        [myTextField1 resignFirstResponder];
    }
    else if (myTextField2.isFirstResponder) {
        [myTextField2 resignFirstResponder];
    }
    else if (myTextField3.isFirstResponder) {
        [myTextField3 resignFirstResponder];
    }
    else if (myTextField4.isFirstResponder) {
        [myTextField4 resignFirstResponder];
    }
}

实际上,我倾向于这样做,而不是先测试特定的UIView是否是当前的第一响应者,并且不认为有任何明显的性能影响/问题(我已经注意到了) :

- (void)dismissKeyboard {
    //Send resignFirstResponder message to all possible first responders...
    [myTextField1 resignFirstResponder];
    [myTextField2 resignFirstResponder];
    [myTextField3 resignFirstResponder];
    [myTextField4 resignFirstResponder];
}

希望有帮助...

答案 2 :(得分:5)

这个快速的代码可以找到第一个响应者:

func findActiveResponderFrame(view:UIView)->UIView?{
  if view.isFirstResponder() {
    return view
  } else {
    for sub in view.subviews {
      if let subView = sub as? UIView,
             found = findActiveResponderFrame(subView){
        return found
      }
    }
  }
  return nil
}

答案 3 :(得分:0)

如果您特别想要获取响应者文本字段,则可以关注。 Get the current first responder without using a private API

如果您只想关闭活动文本字段键盘,也可以使用以下代码 -

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
   [textField resignFirstResponder];
   return YES;
 }

答案 4 :(得分:0)

  

Swift 3的更新

此函数隐藏Swift 3中任何活动文本字段的键盘:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

答案 5 :(得分:0)

发布here的同类问题。 我写了一个基本的表单创建库来处理这个和验证。它被称为Swift POP Form! 它不使用tags,而是设置包含字段的数据源,并使用indexPathForCell来查询哪个是活动文本字段。查看源代码了解更多信息!

编辑: 或者根据要求提供一个片段。此表单使用UITextFields中嵌入的UITableViewCells

extension PopFormViewController: UITextFieldDelegate {

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    guard let cell = textField.superview as? PopFormTableViewCell else {
      fatalError() }

    guard let currentIndex = tableView.indexPath(for: cell) else {
      fatalError("cell does not exist") }

    let nextIndex = IndexPath(row: currentIndex.row + 1, section: currentIndex.section)
    let isLastField = viewModel.dataSource.fields.count == nextIndex.row

    if isLastField {
      cell.textField.resignFirstResponder()
      if shouldValidateOnLastFieldReturnKeyTap {
        validator.validate(self)
      }
      return true
    }

    guard let nextCell = tableView.cellForRow(at: nextIndex) as? PopFormTableViewCell else {
      fatalError() }

    nextCell.textField.becomeFirstResponder()
    return true
  }
}