在集合视图中,我在初始化时创建了一个手势识别器。在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
方法,一切都按预期工作即可。但是,我发现第一个版本不起作用有点令人惊讶。
任何人都可以解释为什么第一个版本不起作用?是因为,当创建手势识别器时,集合视图还没有准备好进行手势吗?那么,手势识别器必须知道它的目标才能被创建?
答案 0 :(得分:3)
好问题。这是因为您在未完全初始化时尝试使用self
。
现在,如何以您想要的方式进行工作?或许声明它 lazily ,就像这样:
private lazy var longPressGesture: UILongPressGestureRecognizer! = {
let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
return gesture
}()
编辑:引用giorashc的回答question:
由于快速的两阶段初始化,您需要初始化 在继承类中使用self之前的父类。
在您的实现中,self尚未由父级初始化 所以你说你应该将它移到你的init方法中 查看控制器并在调用父级后创建按钮 初始化方法
2 Phase Initialization SO问题&答案。