【问题标题】:UIButton Click Event not working if I add UITapGestureRecognizer in swift如果我在 swift 中添加 UITapGestureRecognizer,则 UIButton 单击事件不起作用
【发布时间】:2018-01-11 15:53:12
【问题描述】:

在我的登录页面上,如果我专注于 UITextEdit 以输入电子邮件和密码,则会出现键盘并向上滚动登录页面。如果我触摸键盘外部,我会添加此代码以删除键盘。

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
    
    @objc func dismissKeyboard() {
        view.endEditing(true)
        UIView.animate(withDuration: 0.3, animations: {
            self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
        })
    }
}

在我的 viewDidLoad() 函数中,我是这样添加的。

override func viewDidLoad() 
{
        super.viewDidLoad()
        //TODO
        self.hideKeyboardWhenTappedAround()
       ...
}

效果很好,但是如果我在键盘仍然打开时单击登录按钮,dismisskeyboard() 函数可以工作,但 btnClick 函数不起作用。

@IBAction func LoginBtnClick(_ sender: Any) 
{
        print("loginBtn")
        //...
}

我该如何解决这个问题?

【问题讨论】:

    标签: ios swift uibutton uitapgesturerecognizer


    【解决方案1】:

    我实际上以不同的方式解决了它(我在登录屏幕上遇到了同样的问题)。我只是将键盘的关闭/动画移动到一个带有微小延迟的异步块中,因为它似乎与点击识别器一样,它正在拾取触摸,但不是内部的触摸按钮,可能是因为屏幕已经开始为键盘的解除设置动画。

    @objc func dismissKeyboard() {
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
            self.view.endEditing(true)
            UIView.animate(withDuration: 0.3, animations: {
                self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
            })
        }
    }
    

    【讨论】:

    • 希望您能收到这条消息——这是百万分之一的小费!伟大的想法,干杯。发送赏金:)
    【解决方案2】:

    我已经使用以下代码对其进行了测试:

    import UIKit
    
    extension UIViewController {
        func hideKeyboardWhenTappedAround() {
            let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
            tap.cancelsTouchesInView = false
            view.addGestureRecognizer(tap)
        }
    
        @objc func dismissKeyboard() {
            view.endEditing(true)
            UIView.animate(withDuration: 0.3, animations: {
                self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
            })
        }
    }
    
    class ViewController: UIViewController {
    
        fileprivate let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 400, height: 50))
        fileprivate let button = UIButton(frame: CGRect(x: 20, y: 200, width: 150, height: 50))
    
        override func loadView() {
            super.loadView()
    
            view.addSubview(textField)
            textField.backgroundColor = .lightGray
            view.addSubview(button)
            button.setTitle("Press me", for: .normal)
            button.setTitleColor(UIColor.blue, for: .normal)
            button.addTarget(self, action: #selector(a), for: .touchUpInside)
    
            hideKeyboardWhenTappedAround()
        }
    
        @objc func a() {
            print(">>>> pressed")
        }
    }
    

    a 中的代码被调用。因此,我假设您的代码中还有其他内容导致按钮不起作用。也许您忘记将button 链接到@IBAction LoginBtnClick(_:) - 检查连接是否真的存在。

    【讨论】:

    • 感谢您的回答。键盘打开时调用了 func a()?
    • 是的。虽然当我按下按钮时,dismissKeyboard 也被调用了,所以不仅调用了按钮动作,而且键盘也被解除了。您可以通过简单地在某处展示 ViewController 来尝试我的代码。
    • 您是否确认@IBAction 已连接到情节提要中的按钮?就像一个实验一样,将@IBOutlet 添加到viewController,然后像我一样使用addTarget 以编程方式将按钮链接到LoginBtnClick 方法。有时情节提要中存在故障,也许它表明存在联系,但并没有真正将其连接起来。
    • 但是如果屏幕上没有键盘,登录按钮可以工作。我检查了你的代码,它可以工作。很奇怪,我有点困惑。也许我的代码有问题。
    • 我添加了新的 UIView 并为其添加了手势。感谢您的时间和帮助。也许你的答案也是正确的。正如我所说,我的代码存在一些问题。无论如何,我解决了这个问题。谢谢。
    【解决方案3】:

    不要向主viewController的视图添加手势在UIButton下面添加一个全屏子视图并添加手势

    【讨论】:

      【解决方案4】:

      我在视图控制器的视图上添加了一个按钮(确保您的文本字段位于按钮前面)。 然后,我实现了 UITextFieldDelegate 来启用/禁用按钮。 像这样的:

      class ViewController: UIViewController, UITextFieldDelegate {
          @IBOutlet private weak var myTextfield: UITextField!
          @IBOutlet private weak var myButton: UIButton!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              
              self.myTextfield.delegate = self
          }
          
          // MARK: - UITextFieldDelegate
          func textFieldDidBeginEditing(_ textField: UITextField) {
              self.myButton.isUserInteractionEnabled = true
          }
          
          func textFieldDidEndEditing(_ textField: UITextField) {
              self.myButton.isUserInteractionEnabled = false
          }
          
          // MARK: - Action functions.
          @IBAction private func onButtonAction() {
              self.myTextfield.resignFirstResponder()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 2013-05-29
        • 2021-04-22
        相关资源
        最近更新 更多