Ios 触摸UITextField(swift)之外的任何位置时,如何关闭键盘?

Ios 触摸UITextField(swift)之外的任何位置时,如何关闭键盘?,ios,swift,uitextfield,uikeyboard,Ios,Swift,Uitextfield,Uikeyboard,我正在处理一个有UIViewController的项目,在视图控制器上有一个UIScrollView,在scrollview上有一个UITextField。 这样地: 在文本字段中键入一些文本并点击文本字段外的任何位置后,我试图关闭键盘并隐藏它。 我尝试了以下代码: override func viewDidLoad() { super.viewDidLoad() self.textField.delegate = self; } override func touchesBe

我正在处理一个有UIViewController的项目,在视图控制器上有一个UIScrollView,在scrollview上有一个UITextField。 这样地: 在文本字段中键入一些文本并点击文本字段外的任何位置后,我试图关闭键盘并隐藏它。 我尝试了以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.delegate = self;
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.view.endEditing(true)
}
override func viewDidLoad(){
super.viewDidLoad()
self.textField.delegate=self;
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}
当我点击scrollview外部时,它对我有效,但当我点击scrollview时,什么都不会发生,键盘也不会隐藏

在文本字段外的任何地方点击时,是否有办法关闭键盘?
谢谢

在这种情况下,有一种选择是UITAPPORATE。我试图创建示例代码以防万一。像这样,

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture = UITapGestureRecognizer(target: self, action: "tap:")
        view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}

我在Obj-C中创建了此方法,无论用户当前在何处键入,该方法都会隐藏键盘:

//call this method
+ (void)hideKeyboard {
    //grab the main window of the application
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    //call our recursive method below
    [self resignResponderForView:window];
}

//our recursive method
+ (void)resignResponderForView:(UIView *)view {
    //resign responder from this view
    //If it has the keyboard, then it will hide the keyboard
    [view resignFirstResponder];
    //if it has no subviews, then return back up the stack
    if (view.subviews.count == 0)
        return;
    //go through all of its subviews
    for (UIView *subview in view.subviews) {
        //recursively call the method on those subviews
        [self resignResponderForView:subview];
    }
}

我希望这能转化为Swift,并且有意义。它可以在应用程序中的任何位置调用,并且无论您使用的是哪种VC或任何东西,它都会隐藏键盘。

转到键盘类型,然后选择默认值或需要文本字段的任何内容。然后重写一个方法,你想怎么叫就怎么叫,我通常叫它touchingsbegins。下面是您忘记添加的内容

super.touchingBegins(touches, withEvent: event)
 }

试试这个,它已经过测试并且可以工作了:

适用于Swift 3.0/4.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
self.view.endEditing(true)
}
适用于较老的Swift

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
self.view.endEditing(true)
}

我也遇到了同样的问题,我终于解决了

在故事板中设置TapGestureRecognitor,然后在ViewController中设置插座

@IBOutlet var tapGesture: UITapGestureRecognizer!
@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
 self.view.endEditing(true)
} 
然后在ViewController中设置iAction

@IBOutlet var tapGesture: UITapGestureRecognizer!
@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
 self.view.endEditing(true)
} 
将这些行添加到viewDidLoad方法中

override func viewDidLoad()
{
    super.viewDidLoad()
    self.view.addGestureRecognizer(tapGesture)
}
它应该会起作用


希望这会有帮助

为Swift 4编辑

编辑:添加了
@objc
。虽然这不是性能的最佳选择,但在没有更好的解决方案之前,这里的一个实例不应该导致太多问题

当需要与GestureRecognizer后面的项目交互时,编辑以修复此问题。

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    //Key borad dismiss
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
  }

 //Key board hide on outside the textfield
 @objc func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
  }
}
编辑:感谢@Rao指出这一点。添加了
tap.cancelsTouchesInView=false

这将有助于您拥有多个
UITextView
UITextField

创建视图控制器的扩展。对我来说,这比尝试使用
.resignFirstResponder()

在视图中调用
self.setupToHideKeyboardOnTapOnView()

每次触摸不同的文本字段都会关闭键盘或使用
辞职第一响应程序

extension UIViewController
{
    func setupToHideKeyboardOnTapOnView()
    {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(UIViewController.dismissKeyboard))

        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
    }
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch = [touches anyObject];
 if(![touch.view isMemberOfClass:[UITextField class]]) {
     [touch.view endEditing:YES];
 }
}

当在输入区域外触摸任意数量的输入项时,此功能起作用

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
覆盖函数触摸开始(触摸:设置,withEvent事件:UIEvent?){
self.view.endEditing(true)
}

引入轻触手势识别器,并为其设置和操作

使用以下代码:


nameofyourtextfield.resignfirstresponder()

使用ScrollView的Swift 3工作解决方案

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // The next line is the crucial part
        // The action is where Swift 3 varies from previous versions
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:)))
        self.view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}
另一个是关于这个问题的,我引用和使用的。公认的答案在Swift 3中不再有效。当前选择的答案应为以下答案。

详细信息
  • 代码10.2.1(10E1001),Swift 5
解决方案1

解决方案1的使用。全样本 解决方案2 类TapGestureRecognitor

扩展UIView

解决方案2的使用 溶液2完整样品 看看这个

override func viewDidLoad() {
    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
    self.view.userInteractionEnabled = true
    self.view.addGestureRecognizer(tapGesture)
}
那么您的点击处理程序是

  func handleTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
斯威夫特3

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
}
斯威夫特3

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

//在swift 4中……它对我很有用

func setupKeyboardDismissRecognizer(){
    let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))

    self.view.addGestureRecognizer(tapRecognizer)
}

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
        searchTableView.isHidden = true
    }
//在Swift4中的viewDidLoad中调用此函数setupKeyboardDismissRecognizer()

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

在Swift 4或5中,您可以像..

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    //Key borad dismiss
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
  }

 //Key board hide on outside the textfield
 @objc func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
  }
}

我在Swift 4中使用了以下代码,你可以试试这个

override func viewDidLoad() {
    super.viewDidLoad()

    // dismiss keyboard when tap outside a text field 
    let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewControllerName.dismissKeyboard))
    view.addGestureRecognizer(tapGestureRecognizer)
}

//Calls this function when the tap is recognized.
func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

谢谢,成功了。但我还有一个问题,我有一个视图控制器,有5个文本字段。有没有一个好方法可以让他们不用逐个调用“resignFirstResponder”方法来执行相同的操作?另一个问题,当我点击文本字段外的任何位置时,有没有方法可以关闭键盘?例如,当我点击一个按钮时?@white hat能否将该问题作为另一个问题提问?@white hat将您的5个文本字段放入outlet集合中。然后创建一个dismissKeyboard方法,该方法迭代集合并在每个文本字段上调用resignFirstResponder。您可以从手势识别器和按钮操作调用此方法。@WhiteHat ViewController.View可以调用EndedTing在点击UIScrollViewNote时对我不起作用的方法此方法已更改为覆盖func ToucheSBegind(触摸:设置,withEvent事件:UIEvent?)迅速地2@WhiteHat请参阅上面的我的答案,了解与ScrollView配合使用的Swift 3答案此答案也适用于Swift 4!!谢谢。@Hemang正如@Rao在对已接受答案的评论中所述,当您有TableView时,您需要添加
tap.cancelsTouchesInView=false
。希望有帮助。你可能想退房。@JoeBlow我相信你错了。你应该辞去textField的第一响应者的职务。不是风景。我在当前项目中有这段代码,并在一个新项目中测试了它。更不用说,我的答案只是Pixyzehn.hey dev@Devbot10所写答案的更新版本——请毫不犹豫地将其编辑回你之前的版本。你知道,我可能很困惑
func setupKeyboardDismissRecognizer(){
    let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))

    self.view.addGestureRecognizer(tapRecognizer)
}

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
        searchTableView.isHidden = true
    }
 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.view.endEditing(true)
        }
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    //Key borad dismiss
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
  }

 //Key board hide on outside the textfield
 @objc func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
  }
}
override func viewDidLoad() {
    super.viewDidLoad()

    // dismiss keyboard when tap outside a text field 
    let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewControllerName.dismissKeyboard))
    view.addGestureRecognizer(tapGestureRecognizer)
}

//Calls this function when the tap is recognized.
func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}