Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何获取当前活动的UITextField/UITextView并辞职FirstResponder?_Iphone_Ios_Cocoa Touch_Uiview - Fatal编程技术网

Iphone 如何获取当前活动的UITextField/UITextView并辞职FirstResponder?

Iphone 如何获取当前活动的UITextField/UITextView并辞职FirstResponder?,iphone,ios,cocoa-touch,uiview,Iphone,Ios,Cocoa Touch,Uiview,是否可以在UIView中获取当前活动的UITextField或UITextView,以便我可以使用[text resignFirstResponder]隐藏键盘?如果您特别想获取响应者文本字段,则可以遵循以下步骤。 如果您只想关闭活动文本字段键盘,还可以使用以下代码- - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 如

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

如果您特别想获取响应者文本字段,则可以遵循以下步骤。

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

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

如果不单独测试,就无法直接获得当前第一响应者是什么对象(至少我知道)。您可以创建一个包含所有子视图的方法,这些子视图可能是活动的第一响应者,如下所示:

- (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是否是当前的第一响应者,也不认为存在任何明显的性能问题(我已经注意到):


希望这有助于……

从iOS 2.0及更高版本开始,有一种简单的方法可以关闭键盘,而无需跟踪当前活动的控件,或遍历所有可用控件,或使用
UITextFieldDelegate

[self.view endEditing:YES]
从文档中:

编辑:

使视图(或其中一个嵌入的文本字段) 退出第一响应者状态。

-(
BOOL
)编辑:(
BOOL
)强制

参数

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

返回值
YES
如果视图退出第一响应者状态,或者
NO
如果视图没有退出第一响应者状态。

讨论
此方法查看当前视图及其子视图 当前为第一响应者的文本字段的层次结构。如果 它找到一个,它要求文本字段辞去第一响应者的职务。如果 力参数设置为
YES
,甚至从未询问文本字段; 它被迫辞职


此swift代码用于查找第一响应者:

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
}
Swift 3的更新

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

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
发布了类似问题。 我编写了一个基本的表单创建库来处理这个问题和验证。它叫! 它不使用
标记
,而是设置包含字段的数据源,并使用
indexPathForCell
查询哪个是活动的文本字段。查看源代码了解更多信息

编辑: 或者根据要求,这里有一个片段。此表单使用嵌入在
UITableViewCells
中的
UITextFields

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
  }
}

文本视图可能重复以下内容-这不是必需的[self.view endEditing:YES];如果你能在这里分享代码,你会更有用。
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
  }
}