UITapGestureRecognizer 未触发

UITapGestureRecognizer not firing

让我们把 google 结果排除在外


现在谈谈我是如何构建这个结构的,这是一种尝试使模型完全从视图代码中删除的尝试。

要点是我有这些 classes:

Builder 是这样工作的:

  1. 硬编码构建一堆 CarModels
  2. 用模型硬编码构建一堆 CarModelDisplayClass
  3. 将 CarModelDisplayClass 列表发送到将列表转换为实际视图和手势识别器的方法(通过查看协议一致性)
  4. 将这些视图附加到实际的 UIViewController
  5. 呈现 UIViewController

此时一切正常,除了 UITapGestureRecognizer。

CarModelDisplayClass 实际视图+手势看起来像这样。

for item in items {
    let view = item.view() // Get the view from the Displayable protocol
    superView.addSubview(view)

    if let i = item as? Tappable { // Check Tappable conformance
        let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
        view.addGestureRecognizer(gesture)
        view.isUserInteractionEnabled = true
    }
}

我不确定我是否遗漏了一些明显的东西。我认为可能与目标 i 相关的问题是问题所在,但我也尝试将其定向到 item(我不知道这是否重要)。

任何指点都会有所帮助。


我这里有真正的代码(虽然名称不同)

看来您必须在代码中的某处保留对可点击项的强引用,否则它们将从内存中删除。

根据附加链接中的代码 - 我会将 TLAStackviewBuilder class 更改为 return UIScrollView,但其中包含对 displayRows 的引用。

在您上面编写的代码中:

class Something {

  let storedItems: [Any]!

  func someFunc(items: Tappable) {
     storedItems = items

     for item in items {
        let view = item.view() // Get the view from the Displayable protocol
        superView.addSubview(view)

        if let i = item as? Tappable { // Check Tappable conformance
          let gesture = UITapGestureRecognizer(target: i, action: #selector(i.tapped))
          view.addGestureRecognizer(gesture)
          view.isUserInteractionEnabled = true
        }
    }
  }


}