首页 > 解决方案 > 你在哪里声明与 Swift 中的 addGestureRecognizer() 相关的 UITapGestureRecognizer()?

问题描述

问题

centerLabelGesture是在 的范围之外定义的viewDidLoad(),因此在.addGestureRecognizer(centerLabelGesture)调用时, centerLabelGesture 尚未定义。

import UIKit
import SnapKit

class ViewController: UIViewController {

    var screen: UIView!
    var centerLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        screen = UIView()
        centerLabel = UILabel()

        view.addSubview(screen)
        screen.addSubview(centerLabel)

        screen.backgroundColor = .white
        screen.snp.makeConstraints { (make) in
            make.top.equalTo(view)
            make.right.equalTo(view)
            make.left.equalTo(view)
            make.bottom.equalTo(view)
        }

        centerLabel.text = "I hope I'm centered."
        centerLabel.snp.makeConstraints { (make) in
            make.center.equalTo(screen)
        }
        centerLabel.isUserInteractionEnabled = true
        centerLabel.addGestureRecognizer(centerLabelGesture)
    }

    let centerLabelGesture = UITapGestureRecognizer(target: self, action: #selector(centerLabelTapped))

    @objc func centerLabelTapped() {
        centerLabel.text = "Ouch, you tapped me!"
    }

}

2019 年 1 月 19 日更新

matt 指出centerLabelGesture需要在centerLabel.addGestureRecognizer(centerLabelGesture), inside之前声明viewDidLoad()

标签: swiftxcodeuiviewuilabeluigesturerecognizer

解决方案


这是一个微妙的错误。问题是您放置此行的位置:

let centerLabelGesture = UITapGestureRecognizer(target: self, action: #selector(centerLabelTapped))

将该行移到viewDidLoad代码中:

centerLabel.isUserInteractionEnabled = true
let centerLabelGesture = UITapGestureRecognizer(target: self, action: #selector(centerLabelTapped))
centerLabel.addGestureRecognizer(centerLabelGesture)

原因是你有那行,它是一个实例属性,当你说self作为实例属性初始化器中的目标时,它并不意味着你认为它做了什么(它意味着class,而不是instance) ,因此当您点击时的消息被误导并且什么都不做。

我已经就这个问题提交了一个错误;在我看来,编译器至少应该警告你你正在犯一个潜在的错误。


推荐阅读