【问题标题】:Gesture recognizer not working if created at class init time如果在类初始化时创建手势识别器不起作用
【发布时间】:2017-10-11 09:29:47
【问题描述】:

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

谁能解释为什么第一个版本不起作用?是因为在创建手势识别器时,集合视图还没有准备好手势吗?那么,手势识别器必须知道哪些关于其目标的信息才能被创建?

【问题讨论】:

    标签: ios uicollectionview uigesturerecognizer


    【解决方案1】:

    好问题。那是因为您在未完全初始化时尝试使用 self

    现在,如何按照您想要的方式进行操作?也许懒惰地声明它,像这样:

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

    编辑:从 question 引用 giorashc 的回答:

    由于 swift 的两阶段初始化,您需要初始化 在继承类中使用 self 之前的父类。

    在您的实现中,self 尚未由父级初始化 类,所以你说你应该把它移到你的 init 方法 查看控制器并在调用父级后创建按钮 初始化方法

    2 Phase Initialization SO问答。

    【讨论】:

    • 确实可以使用惰性声明。您可以简单地接受我的声明并将let 替换为lazy var,而无需代码块。但是,我的问题是关于最初尝试不起作用的确切原因。我知道self 可能没有完全初始化,但是那个时候手势识别器缺少什么(self 应该定义为指针,如果没有,我们不应该被允许使用它由编译器)?如果是关于它应该处理的视图范围,那么即使在viewDidLoad 的级别上也尚未设置几何图形。
    • 再次查看我的答案。我希望我添加了正确的解释。
    • 毫无疑问这是正确的解释(我会接受)。然而,这引发了一个问题:如果self 还没有准备好使用,为什么编译器允许我们在那里使用self?如您所知,我们无法在 XCode 中使用 alt+click 直接检查 self 的类型。然而,通过编写let test = self 并在test 上单击alt,我惊讶地发现self 的类型不是ViewController 而是(ViewController) -> () -> ViewController(即,一个接受ViewController 并返回的闭包一个不接受任何内容并返回 ViewController) 的闭包。现在我有点困惑......
    • 对不起,如果我不能进一步回答你的问题,我想我可以,但我担心我会给你错误的信息。也许Apple的文档可以回答您的此类后续问题。或者更好的是,将其作为一个新问题打开。不过这对我来说很有趣,我想知道正确的答案。 :D 因为我的想法很可能是不正确的。
    • 我接受了你的回答并在这里发布了一个新问题stackoverflow.com/questions/46797017/…
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多