【问题标题】:UITapGestureRecognizer not attaching actionUITapGestureRecognizer 未附加操作
【发布时间】:2021-01-15 12:14:47
【问题描述】:

我为 View 创建了一个单独的类。 我将所有功能都留在了 Controller 中。 但是当我在图片上添加点击时,由于某种原因它不起作用。

import UIKit

class APOTDView: UIView {

    var imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(APOTDViewController.imageTapped(_:)))
        imageView.addGestureRecognizer(tap)

        return imageView
    }()
}
import UIKit

class APOTDViewController: UIViewController {

    let av = APOTDView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // ... add subview and constraint
    }

    @objc func imageTapped(_ sender: UITapGestureRecognizer) {
        print("good job")
    }
}

怎么了?请帮我弄清楚

【问题讨论】:

  • 尝试签名@objc func handleTap(_ sender: UITapGestureRecognizer? = nil) { // 处理代码 }

标签: swift uitapgesturerecognizer


【解决方案1】:

您在 UITapGestureRecognizer 中的选择器错误。不能直接调用 APOTDViewController。
APOTDViewController.imageTapped 将是一个静态函数,不可用。

您可以改用委托。

委托协议和视图。

protocol APOTDViewDelegate: AnyObject {
    func viewDidTapImage()
}

class APOTDView: UIView {
    weak var delegate: APOTDViewDelegate?

    var imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
        imageView.addGestureRecognizer(tap)

        return imageView
    }()

    @objc func imageTapped() {
        delegate?.viewDidTapImage()
    }
}

视图控制器:

class APOTDViewController: UIViewController, APOTDViewDelegate {
    let av = APOTDView()

    override func viewDidLoad() {
        super.viewDidLoad()
        av.delegate = self
        // ... add subview and constraint
    }

    @objc func viewDidTapImage() {
        print("good job")
    }
}

【讨论】:

  • 还是不行。你确定没有看错?
  • @egorskikh 尝试从视图控制器类函数中删除 @objc。像这样func viewDidTapImage() { print("good job") }
  • @RajaKishan 无论如何它对我不起作用......我也尝试了你的答案。什么都没有出来
  • 那么问题出在您的代码中。我测试并发布后。请再次检查您的代码
  • @RajaKishan 谢谢。我会寻找问题。虽然一切都写成书面florieger
【解决方案2】:

这不起作用,因为您直接调用UIViewController 方法而没有任何类引用或对象。解决方案是使用协议或 clouser 来获取从视图到类的操作。

class APOTDView: UIView {
    @objc var imageViewAction: ((UITapGestureRecognizer) -> Void)? = nil
    
    lazy var imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.backgroundColor = .blue
        imageView.translatesAutoresizingMaskIntoConstraints = true
        imageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector((imageTapped(_:))))
        imageView.addGestureRecognizer(tap)
        return imageView
    }()
    
    @objc private func imageTapped(_ sender: UITapGestureRecognizer) {
        self.imageViewAction?(sender)
    }
}

视图控制器

class APOTDViewController: UIViewController {
    let av = APOTDView()

    override func viewDidLoad() {
        super.viewDidLoad()
        av.imageViewAction = { sender in
            print("good job")
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多