如果在初始化时间

时间:2017-10-11 09:29:47

标签: ios uicollectionview uigesturerecognizer

在集合视图中,我在初始化时创建了一个手势识别器。在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方法,一切都按预期工作即可。但是,我发现第一个版本不起作用有点令人惊讶。

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

1 个答案:

答案 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问题&答案。