UITap 手势未被识别

UITap Gesture Not being recognized

我有一个带有按钮的视图控制器,该按钮具有以下操作。

@IBAction func sourceButton(_ sender: Any) {
    let menu = sourceMenu()
    menu.openMenu()
}

源菜单 class 是一个具有以下代码的 NSObject class。

class sourceMenu: NSObject {
    let blackView = UIView()

    public func openMenu(){

        if let window = UIApplication.shared.windows.filter({ [=11=].isKeyWindow }).first {
            blackView.frame = window.frame
            blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
            blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu)))
            window.addSubview(blackView)
            UIView.animate(withDuration: 0.5) {
                self.blackView.alpha = 1
            }
        }


    }

    @objc public func dismissMenu(){
        UIView.animate(withDuration: 0.5) {
            self.blackView.alpha = 0

        }
    }

}

当我点击视图控制器时,函数 dismissMenu 没有被调用。有任何想法吗? 谢谢。

这个问题我遇到过一次。我为自己找到的解决方案是强烈引用 UITapGestureRecognizer。所以你应该做的是:

// Define a gesture variable in class
class sourceMenu: NSObject {
    var gestureRecognizer: UITapGestureRecognizer
}

// Use the variable in `openMenu` function
gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu)) 
blackView.addGestureRecognizer(gestureRecognizer)

}

希望对您有所帮助。

问题实际上是您的对象正在从内存中释放,因为它只存在于您的功能块中。一旦函数完成执行,您的内存就会被清除。您需要在呈现 UIViewController 中创建一个实例,以便 arc 使其保持活动状态,因为视图控制器将引用它。你应该像这样声明一个 属性。

class ViewController: UIViewController {

  let menu = sourceMenu()

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
  }

  @IBAction func tapAction(_ sender: Any) {
    menu.openMenu()
  }

}

您也可以通过简单地执行 UIApplication.shared.keyWindow

来获取对 keyWindow 的引用

此外,您在 window 上显示此内容而不是使用视图控制器的原因是什么?如果这是每个控制器都应该能够呈现的内容,为什么不进行扩展呢?我会避免展示 window 的观点,因为它可能会导致隐藏的问题。