手势识别器如果在类初始化时创build,则不起作用

在集合视图中,我在类初始化时创build一个手势识别器。 在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) } } 

有了这个,手势识别器不起作用。

修复很简单:将longPressGesture移动到viewDidLoad方法就足够了,一切都按预期工作。 不过,我觉得第一个版本不行,这有点令人惊讶。

任何人都可以解释为什么第一个版本不工作? 这是因为,当手势识别器被创build时,收集视图还没有准备好手势? 那么,手势识别器必须知道它的目标才能被创build?

好问题。 那是因为你在没有完全初始化的时候试图使用self

现在,如何以你想要的方式来完成工作? 也许是懒洋洋地宣布,像这样:

 private lazy var longPressGesture: UILongPressGestureRecognizer! = { let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:))) return gesture }() 

编辑:引用giorashc从这个问题的答案:

由于swift的两阶段初始化,你需要初始化父类,然后才能在inheritance类中使用self。

在你的实现中,self还没有被父类初始化,所以你说你应该把它移动到你的视图控制器的init方法,并在调用父类的初始化方法之后创buildbutton

2阶段初始化 SO问题和答案。