您在哪里声明与 Swift 中的 addGestureRecognizer() 相关的 UITapGestureRecognizer()?

Posted

技术标签:

【中文标题】您在哪里声明与 Swift 中的 addGestureRecognizer() 相关的 UITapGestureRecognizer()?【英文标题】:Where do you declare UITapGestureRecognizer() in relation to addGestureRecognizer() in Swift? 【发布时间】:2018-08-03 16:28:47 【问题描述】:

问题

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) 之前声明,在viewDidLoad() 内部

【问题讨论】:

【参考方案1】:

这是一个微妙的错误。问题是你把这行放在哪里:

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),所以当你点击时的消息被误导并且什么都不做。

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

【讨论】:

还要澄清我的笔记,当你说 “原因是你有那行的地方,它是一个实例属性” 它的实例属性是什么? ViewController。你可能想开始阅读我的在线 Swift 解释:apeth.com/swiftBook/ch01.html#_object_members 哇太酷了!我上周刚买了你的 O'Reilly ios 11 书...:D 谢谢马特! :) 它是双向的。 Stack Overflow 上的问题(就像你的问题一样)给了我关于书籍需要解释什么样的事情的线索!【参考方案2】:

尝试在 viewDidLoad 中添加这一行

centerLabelGesture.numberOfTapsRequired = 1

【讨论】:

嗯,在viewDidLoad 中添加这个会返回错误:Value of type 'UILabel' has no member 'numberOfTapsRequired'

以上是关于您在哪里声明与 Swift 中的 addGestureRecognizer() 相关的 UITapGestureRecognizer()?的主要内容,如果未能解决你的问题,请参考以下文章

迁移到惯用的 Swift 2 的清单(又名 Swift 2 转换指南在哪里)?

为啥 Java 变量不更频繁地声明为“final”?与 swift 中的 let 关键字进行比较 [关闭]

Swift学习之中的一个:常量与变量

声明函数时,“->”在swift中是啥意思?

当您在 Swift 中有嵌套函数时,如何将布尔值返回给外部函数?

Swift 学习笔记 (函数)