您在哪里声明与 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 关键字进行比较 [关闭]