【问题标题】:Add tap gesture to UIStackView向 UIStackView 添加点击手势
【发布时间】:2016-09-08 16:45:35
【问题描述】:

我试图在collectionView 单元格中将UITapGesture 添加到UIStackView,但每次我的应用程序崩溃。 (所有IBOutlets 都已连接)这是我在这里做错了吗?

 let fGuesture = UITapGestureRecognizer(target: self, action: #selector(self.showF(_:)))
 cell.fstackView.addGestureRecognizer(fGuesture)

 func showF(sender: AnyObject){
        print(111)
    }

【问题讨论】:

  • #selector(self.self 更改为您的班级名称
  • 向我们展示您的崩溃情况(控制台输出)。
  • 如果你使用的是 Swift 4,你需要 @objc on showF。此外,showF 应该包含一个 _ 作为参数。

标签: ios swift uistackview


【解决方案1】:

stackview 是否启用了 touch ? 尝试设置用户交互参数

cell.fstackView.isUserInteractionEnabled = true 

【讨论】:

    【解决方案2】:

    如果应用程序由于fatal error: unexpectedly found nil while unwrapping an Optional value 而崩溃 - 您可能需要在将手势识别器添加到堆栈视图之前添加一些延迟。

    如果您在集合视图单元子类的 init 或集合视图的委托方法中访问堆栈视图属性,则堆栈视图可能尚未初始化。尝试使用计时器或 GCD 添加 0.1 秒的延迟,它应该可以正常工作...

    Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(prepareStackView), userInfo: nil, repeats: false)
    

    ...

    @objc func prepareStackView() {
        let tap = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
        myStackView.addGestureRecognizer(tap)
    }
    

    【讨论】:

    • 我建议不要使用计时解决方案。它们很脆弱并且可能由于多种原因而损坏(较新的设备运行速度更快并且会破坏时间,新的操作系统版本会更改顺序等)。在这种情况下,我建议使用生命周期事件,例如 awakeFromNib。
    【解决方案3】:

    在主线程中设置手势识别器:

    DispatchQueue.main.async {
        self.view.gestureRecognizers = [self.tapGestureRecognizer]
    }
    

    【讨论】:

      【解决方案4】:

      我有 UIButtons 作为子视图,所以即使我向 UIStackView 添加手势,它也会忽略我的手势。

      所以我添加了代码

      button.isUserInteractionEnabled = false
      

      让 UIStackView 收到我的触摸。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多