swift - 你在哪里声明与 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()
解决方案
这是一个微妙的错误。问题是您放置此行的位置:
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) ,因此当您点击时的消息被误导并且什么都不做。
我已经就这个问题提交了一个错误;在我看来,编译器至少应该警告你你正在犯一个潜在的错误。
推荐阅读
- python - 将熊猫系列附加到索引零的左侧
- reactjs - Redux 商店未更新
- javascript - 无法在外部 js 中定义的 javascript 函数中使用 jQuery
- ada - 如何读取每个单词并将其存储到要使用的变量中?
- flexbox - 我不能在弹性框中使用省略号,我该怎么办?
- java - java - 如何在java中的injectmocks注释类下模拟私有方法
- r - 我的绘图下拉菜单没有正确更新数据是有原因的吗?
- javascript - 模态不适用于一系列按钮
- jquery - 如何根据所需规则(而不是其名称或索引)重新排序 JSON?
- python - 如何在 Django 中处理来自 HTML 的使用“Post”或“GET”方法提交的文本?