手势识别器如果在类初始化时创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问题和答案。