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

Tyi*_*ilo 13 iphone cocoa-touch uiview ios

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

mem*_*ons 27

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

[self.view endEditing:YES]
Run Code Online (Sandbox Code Playgroud)

来自文档:

endEditing:

导致视图(或其中一个嵌入的文本字段)重新签署第一个响应者状态.

- (BOOL)endEditing :( BOOL)强制

参数
force
指定YES强制第一个响应者辞职,无论是否要这样做.如果视图重新调整了第一个响应者状态,或者它没有,则

返回值.
YESNO

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


Ash*_*win 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望有帮助......

  • 这不是必要的,[self.view endEditing:YES]; 会做 (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
}
Run Code Online (Sandbox Code Playgroud)