防止 UIStepper 为 0?

Prevent UIStepper from being 0?

我有一个 UIStepper,其中 stepValue1。我希望 UIStepper 在其 maximumminimum 值之前能够为正或负,但永远不会 0

我为解决这个问题所做的每一次尝试都无法解释步进器是在减少还是在增加(因此应该跳过 01-1)。我唯一能想到的另一件事是保存以前的值并进行比较,但是对于这样一个简单的任务来说这听起来有点复杂。

有什么想法吗?还有其他人 运行 符合相同的要求吗?

Key-Value 观察非常容易。它需要一个 IBOutlet 的步进器

@IBOutlet var stepper: UIStepper!

声明一个 NSKeyValueObservation 属性

var observation : NSKeyValueObservation?

viewDidLoad观察stepper的value如果new值为0则调整oldnew 值检测步进方向

override func viewDidLoad() {
    super.viewDidLoad()
    observation = stepper.observe(\.value, options: [.old, .new], changeHandler: { (stepper, change) in
        if change.newValue! == 0.0 {
            if change.newValue! > change.oldValue! {
                stepper.value = 1
            } else {
                stepper.value = -1
            }
        } 
    })
}

如果步进器位于 table 视图单元格中,则声明单元格中的出口和 observation 属性 并在控制器的 cellForRow 中分配观察器

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyGreatCell
    let model = datasource[indexPath.row] // just an example
    cell.stepper.value = model.stepperValue
    ... 
    cell.observation = cell.observe(\.stepper.value, options: [.old, .new], changeHandler: { (stepper, change) in
        if change.newValue! == 0.0 {
            if change.newValue! > change.oldValue! {
                stepper.value = 1
            } else {
                stepper.value = -1
            }
        }
        model.stepperValue = stepper.value
    } 
    return cell
 }

并且您必须实施 didEndDisplaying 来释放观察者

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let tableCell = cell as! MyGreatCell
    tableCell.observation = nil
}

我会从不同的方向来处理这个问题。让步进器做它做的,只是改变你对它的解释。

例如,如果您有一个步进器,您想要从 -5 转到 +5 但跳过 0:

  1. 将步进器 minumum 设置为 -5
  2. 将步进器 maximum 设置为 4
  3. 将步进器 stepValue 设置为 1
  4. 当你阅读步进器value时,添加1如果value是non-negative:

    let value = stepper.value + (stepper.value < 0 ? 0 : 1)
    
  5. 设置步进器value时,首先将正值降低1:

    // value of 3 will be represented in the stepper by 2
    value = 3
    stepper.value = value - (value > 0 ? 1 : 0)
    

nonZeroValue 计算隐藏细节 属性

您可以隐藏这些 +1-1 调整,方法是创建 UIStepper 的扩展,添加一个名为 nonZeroValue 的新计算 属性。

extension UIStepper {
    var nonZeroValue: Double {
        get {
            return self.value + (self.value < 0 ? 0 : 1)
        }
        set {
            self.value = newValue - (newValue < 0 ? 0 : 1)
        }
    }
}

然后,只需在您的代码中使用 stepper.nonZeroValue 代替 stepper.value