阻止UIStepper设为0?

时间:2019-07-03 07:29:37

标签: ios swift uistepper

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

我为解决此问题所做的每一次尝试都无法说明步进器是减小还是增大(因此应将0跳到1或跳到-1)。我唯一能想到的就是保存先前的值并进行比较,但这听起来像是涉及到这么简单的任务。

有什么想法吗?还有其他人遇到过同样的要求吗?

2 个答案:

答案 0 :(得分:1)

键值观察非常容易。它需要07-03 09:49:18.477: E/Fitness(19288): Error reading goals. 07-03 09:49:18.477: E/Fitness(19288): java.lang.IllegalStateException: Create time should be specified. 07-03 09:49:18.477: E/Fitness(19288): at rxp.a(:com.google.android.gms@17785037@17.7.85 (100400-253824076):13) 07-03 09:49:18.477: E/Fitness(19288): at zre.a(:com.google.android.gms@17785037@17.7.85 (100400-253824076):69) 07-03 09:49:18.477: E/Fitness(19288): at yus.handleMessage(:com.google.android.gms@17785037@17.7.85 (100400-253824076):1) 07-03 09:49:18.477: E/Fitness(19288): at skd.run(:com.google.android.gms@17785037@17.7.85 (100400-253824076):8) 07-03 09:49:18.477: E/Fitness(19288): at skq.b(:com.google.android.gms@17785037@17.7.85 (100400-253824076):37) 07-03 09:49:18.477: E/Fitness(19288): at skq.run(:com.google.android.gms@17785037@17.7.85 (100400-253824076):21) 07-03 09:49:18.477: E/Fitness(19288): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 07-03 09:49:18.477: E/Fitness(19288): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 07-03 09:49:18.477: E/Fitness(19288): at sqo.run(Unknown Source:7) 07-03 09:49:18.477: E/Fitness(19288): at java.lang.Thread.run(Thread.java:764) 07-03 09:49:18.478: E/health(17059): Cannot read goals, status code 5008, message null 的步进器

IBOutlet

声明一个@IBOutlet var stepper: UIStepper! 属性

NSKeyValueObservation

var observation : NSKeyValueObservation? 中观察步进器的viewDidLoad并在 new 值为0时对其进行调整。KVO的好处是您可以获得valueold值来检测步进方向

new

如果步进器位于表视图单元格中,则在单元格中声明出口和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 } } }) } 属性,并在控制器的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

答案 1 :(得分:1)

我将从另一个方向来处理这个问题。让步进器执行其操作,然后更改您对此的解释。

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

  1. 将步进机minumum设置为-5
  2. 将步进机maximum设置为4
  3. 将步进机stepValue设置为1
  4. 当您阅读步进value时,如果1为非负数,请添加value

    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的扩展名来隐藏这些-1UIStepper的调整,以添加一个名为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