在 Swift 中,您在哪里声明与 addGestureRecognizer() 相关的 UITapGestureRecognizer()?
Where do you declare UITapGestureRecognizer() in relation to addGestureRecognizer() in Swift?
问题
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()
内
尝试在 viewDidLoad 中添加这一行
centerLabelGesture.numberOfTapsRequired = 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,而不是 实例 ),所以当你点击时的消息是被误导了,什么也没做。
我已经提交了关于这个问题的错误;在我看来,编译器至少应该警告你你犯了一个潜在的错误。
问题
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()
尝试在 viewDidLoad 中添加这一行
centerLabelGesture.numberOfTapsRequired = 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,而不是 实例 ),所以当你点击时的消息是被误导了,什么也没做。
我已经提交了关于这个问题的错误;在我看来,编译器至少应该警告你你犯了一个潜在的错误。