[英]Gesture recognizer not working if created at class init time
在集合视图中,我在初始化时创建了一个手势识别器。 在viewDidLoad
方法中,我然后将手势识别器添加到集合视图中。
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
@objc func handleLongGesture(gesture: UILongPressGestureRecognizer) {
// some code
}
override func viewDidLoad() {
super.viewDidLoad()
collectionView.addGestureRecognizer(longPressGesture)
}
}
这样,手势识别器不起作用。
修复很简单:只需将let longPressGesture
移动到viewDidLoad
方法就可以了,所有内容都按预期工作。 但是,我发现第一个版本不起作用有点令人惊讶。
任何人都可以解释为什么第一个版本不起作用? 是因为,当创建手势识别器时,集合视图还没有准备好进行手势吗? 那么,手势识别器必须知道它的目标才能被创建?
好问题。 那是因为你没有完全初始化时试图使用self
。
现在,如何以您想要的方式实现这项工作? 也许是懒洋洋地宣布它,如下:
private lazy var longPressGesture: UILongPressGestureRecognizer! = {
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
return gesture
}()
编辑:从这个问题引用giorashc的答案:
由于swift的两阶段初始化,您需要初始化父类,然后才能在继承类中使用self。
在你的实现中,self还没有被父类初始化,所以你说你应该将它移动到视图控制器的init方法并在调用父类的初始化方法后创建按钮
2阶段初始化 SO问答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.