swift - UITapGestureRecognizer 未附加操作
问题描述
我为 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")
}
}
怎么了?请帮我弄清楚
解决方案
您在 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")
}
}
推荐阅读
- node.js - 如何在 nodejs 中使用“脚本”
- math - 如何根据采购订单中供应商提供的折扣计算价格?
- react-native - 使用 react-native-webview 加载静态 HTML 内容并向其添加 baseUrl。点击时返回意外的 url
- c# - 如何将 List 对象插入到 sqlite?
- android - 带有一组颜色动态可绘制对象的 Android 图像按钮
- python - 查找与条件匹配的行中的最后一个元素
- javascript - 如何使用服务工作者内部的获取请求来模拟真实的“访问”
- python - 为什么禁止使用名为“None”的成员变量(“属性”)?
- angular - 如何在Angular中单击菜单时导航到外部URL
- angular - “在 '@angular/cdk/platform' 中找不到导出 '_supportsShadowDom'