繁体   English   中英

如果在初始化时创建,则手势识别器无法正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM