如何防止在拖动 UIPickerView 时触发按钮?

Posted

技术标签:

【中文标题】如何防止在拖动 UIPickerView 时触发按钮?【英文标题】:How to prevent buttons to be triggered while dragging the UIPickerView? 【发布时间】:2019-07-19 22:21:33 【问题描述】:

我创建了一个自定义操作表,其中包含一个 UIPickerView 和两个按钮(见下图)。

当我向下拖动滚动时,我的手指(我在屏幕截图上表示它)在它“悬停”它时按下按钮。

最终我将手指放在取消按钮上,因此将触发取消事件(当然,这同样适用于确定按钮)。

我应该怎么做才能不发生?

在我的应用中创建各种操作表的代码如下:

/**
 Creates and present action sheet
 */
public func createAndPresentActionSheet(_ parent: UIViewController, title: String, message: String, tag: PickerDataSource, _ completion: @escaping ((_ action: UIAlertAction)->())) 

    let vc = UIViewController()
    vc.preferredContentSize = CGSize(width: 250,height: 200)

    let pickerView = UIPickerView()
    pickerView.isExclusiveTouch = true
    pickerView.tag = tag.rawValue
    pickerView.delegate   = parent as? UIPickerViewDelegate
    pickerView.dataSource = parent as? UIPickerViewDataSource
    vc.view.addSubview(pickerView)
    pickerView.stitchWithConstraints(to: vc.view)

    var row = 0
    switch tag 
    case .gas:                      row = -1 + GasStation.carGas.rawValue

    case .averageSpeed:             row = -1 + Int(GasStation.carAverageSpeed*1e-3)
    case .consumptionPer100km:      row = -1 + Int(GasStation.carGasConsumptionPer100km)
    case .tankVolume:               row = -1 + Int(GasStation.carGasTankVolume)
    case .usualVolumeRefill:        row = -1 + Int(GasStation.carGasUsualRefill)

    case .databaseMinimumFreshness: row = 0
    

    print("\(#function): row = \(row)")

    if row < 0  row = 0 

    print("\(#function): row = \(row) once fixed from being negative")

    pickerView.selectRow(row, inComponent: 0, animated: true)



    let alert = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)
    alert.setValue(vc, forKey: "contentViewController")
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler:  action in

        if let tvc = parent as? UITableViewController 
            // Reload from data source
            tvc.tableView.reloadData()

            // Force display
            //tvc.tableView.setNeedsDisplay()
        
        // Call completion
        return completion(action)
    ))
    alert.addAction(UIAlertAction(title: "Annuler", style: .cancel, handler: nil))
    parent.present(alert, animated: true)

【问题讨论】:

我会尝试在 UIPickerView 上设置 ExclusiveTouch。 唉,不。相同的行为。 【参考方案1】:

我可以看看你设置 UIAlertController 的代码吗?我试图复制你的 UIAlertController 并没有得到你描述的问题。

【讨论】:

以上是关于如何防止在拖动 UIPickerView 时触发按钮?的主要内容,如果未能解决你的问题,请参考以下文章

React,如何防止在拖动后执行单击事件?

拖动子元素时触发 Svelte 可拖动,onleave 事件

防止拖动本地代码/项目触发draenter

如何让我的窗口从另一个在 MacOS 上拖动的窗口中窃取焦点?

如何在手指从1按钮拖动到下一个按钮时触发UIButton事件

如何阻止按钮推翻拖动手势