在集合视图中,我在类初始化时创建了一个手势识别器。在 viewDidLoad 方法,然后将手势识别器添加到集合视图。
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视图 方法,一切按预期进行。然而,我发现第一个版本不起作用有点奇怪。
let longPressGesture
viewDidLoad视图
有人能解释为什么第一个版本不起作用吗?是因为在创建手势识别器时,集合视图尚未准备好使用手势吗?那么,为了创建手势识别器,手势识别器必须了解其目标的哪些信息?
好问题。那是因为你试图使用 self 未完全初始化时。
self
懒散地 ,如下所示:
private lazy var longPressGesture: UILongPressGestureRecognizer! = { let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:))) return gesture }()
编辑:引用Giorasch的回答 question :
由于swift的两阶段初始化,您需要初始化 父类,然后才能在继承类中使用self。 在您的实现中,父级尚未初始化self 类,所以正如您所说的,您应该将其移动到 查看控制器并在调用父控制器后创建按钮 初始化方法
由于swift的两阶段初始化,您需要初始化 父类,然后才能在继承类中使用self。
在您的实现中,父级尚未初始化self 类,所以正如您所说的,您应该将其移动到 查看控制器并在调用父控制器后创建按钮 初始化方法
2 Phase Initialization SO问题;答复