【问题标题】:How to disable a button when the 1st row in a custom picker view is selected?选择自定义选择器视图中的第一行时如何禁用按钮?
【发布时间】:2017-03-14 00:30:50
【问题描述】:

我有一个用于 2 个视图控制器的自定义 UIPickerView 类(也符合 UIPickerViewDelegate、UIPickerViewDataSource)。 所以在他们两个我都有这个: myPickerView.delegate = myPickerViewdataSource 相同。 所有行和组件都在该自定义选取器视图类中配置。

我想在选择第一行时禁用 VC 中的按钮。 通常我会通过使用选取器视图的委托函数之一 (pickerView(_:,didSelectRow:, inComponent:) 来做到这一点,但由于我使用了一个已经符合 UIPickerViewDelegate 的自定义函数,所以我不能这样做。

【问题讨论】:

    标签: ios swift uipickerview


    【解决方案1】:

    嗯,很棘手。问题是选择器是它自己的委托,这使得解决方案有点复杂,但这是我可能会做的:给选择器一个闭包,当所选行发生变化时调用它。然后从委托方法调用该闭包。

    class MyPickerView {
        typealias SelectedIndexClosure = (Int) -> Void
        var selectedIndexClosure: SelectedIndexClosure = { _ in }
    
    ...
    
        func picker(_ picker: UIPickerView, didSelectRow row: Int ...) {
            selectedIndexClosure(row)
        }
    }
    

    然后您将selectedIndexClosure 设置为您希望在视图控制器中运行的任何代码。

    myPickerView.selectedIndexClosure = { [weak self] index in
        self?.button.enabled = (index == 1)
    }
    

    应该这样做。更惯用的解决方案可能是将选取器的数据源和委托方法重构为视图控制器拥有的新的独立对象,但这应该可以正常工作。

    【讨论】:

      【解决方案2】:

      如果你只需要设置一次,你可以说self.button.isEnabled = self.picker.selectedRow(inComponent: 0) == 0。如果您需要在移动选择器后重新启用它,或者如果您移回第一行则将其禁用,您将需要使用相同的委托方法。

      【讨论】:

      • 是的,每次用户选择第一行时我都需要触发它。我似乎无法将@IBAction 添加到选择器视图中,它仅表明我可以添加OutletOutlet collection。我怎样才能使用相同的委托方法呢?我不能覆盖它或扩展类
      • @PavelOrel Huh - 我想你是对的。您可以用于日期选择器,但不能用于常规选择器。去图吧。
      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多