gpt4 book ai didi

ios - 如果在类初始化时创建手势识别器不起作用

转载 作者:行者123 更新时间:2023-12-01 15:58:04 25 4
gpt4 key购买 nike

在 Collection View 中,我在类初始化时创建了一个手势识别器。在 viewDidLoad方法,然后我将手势识别器添加到 Collection View 中。

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方法,一切都按预期工作。但是,我发现第一个版本不起作用有点令人惊讶。

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

最佳答案

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

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

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

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

Due to swift's 2-phase initialization you need to initialize the parent class before you can use self in the inheriting class.

In your implementation self is yet to be initialized by the parent class so as you said you should move it to the init method of your view controller and create the button after calling the parent's initialization method



2 Phase Initialization所以问答。

关于ios - 如果在类初始化时创建手势识别器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com