无法识别UITap手势

问题描述 投票:0回答:2

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

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

源菜单类是带有以下代码的NSObject类。

class sourceMenu: NSObject {
    let blackView = UIView()

    public func openMenu(){

        if let window = UIApplication.shared.windows.filter({ $0.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。有任何想法吗?谢谢。

swift xcode uitapgesturerecognizer
2个回答
1
投票

问题实际上是因为对象仅存在于功能块中,所以您正在从内存中释放它。函数完成后,其执行内存将被清除。您需要在演示文稿UIViewController中创建一个实例,以便系统通过视图控制器使它保持活动状态。您应该像这样声明一个属性。

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的引用>

还有,为什么要在窗口上显示此内容而不使用视图控制器?如果这是每个控制器都应该能够显示的内容,为什么不进行扩展呢?我会避免从窗口显示视图,因为这可能会导致隐藏的问题。


0
投票

我曾经遇到此问题。我为自己找到的解决方案对UITapGestureRecognizer有很强的参考价值。因此,您应该做的是:

© www.soinside.com 2019 - 2024. All rights reserved.