代码之家  ›  专栏  ›  技术社区  ›  Maiaux

如果在类初始化时创建,则手势识别器不工作

  •  2
  • Maiaux  · 技术社区  · 8 年前

    在集合视图中,我在类初始化时创建了一个手势识别器。在 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 回复  |  直到 8 年前
        1
  •  4
  •   Glenn Posadas    8 年前

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

    懒散地 ,如下所示:

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

    编辑:引用Giorasch的回答 question :

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

    在您的实现中,父级尚未初始化self 类,所以正如您所说的,您应该将其移动到 查看控制器并在调用父控制器后创建按钮 初始化方法

    2 Phase Initialization SO问题;答复

    推荐文章