SwiftUI中步进器的奇怪行为

时间:2019-11-20 17:34:39

标签: swiftui stepper

我想使用onIncrement和onDecrement在手动(非绑定)模式下使用Stepper视图。当我尝试实现上下限时,会有一个奇怪的行为。年龄值不超过1或不超过10。

如果您尝试下面的代码,则可以在它已经具有值“ 1”之后按两次“-”。它没有达到预期的1,但是在另外两次按下后,“-”按钮突然被禁用。如果您然后按“ +”,则不会发生任何事情。仅在再按两次“ +”后,计数器才会按预期反应并转至2。

这是一个错误吗?

struct StepperTest: View {
    @State private var age = 5

    var body: some View {
        VStack {
            Stepper("Enter your age", onIncrement: {
                if self.age < 10 {
                    self.age += 1
                    print("Adding to age")
                }
            }, onDecrement: {
                guard self.age > 1 else { return }
                self.age -= 1
                print("Subtracting from age")
            })

            Text("Your age is \(age)")
        }
    }
}

4 个答案:

答案 0 :(得分:0)

我认为这是解释:

  

///如果尝试递增,onIncrement将初始化为nil
  /// value无效。同样,onDecrement将被初始化
  ///如果尝试递减nil无效,则value

如果您尝试

Stepper("Enter your age", onIncrement: {
    print("Adding to age")
}, onDecrement: {
    print("Subtracting from age")
})

...您将看到步进器进入了您所描述的相同状态,因此Apple跟踪了步进器视图的重建,如果用户对步进器的操作未发起任何重建(即无作用),它将禁用自身。

另一个问题是为什么它不是一次...

答案 1 :(得分:0)

在递增后检查并重置值似乎可行:

Stepper("Enter your age", onIncrement: {
                    self.age += 1
                    if self.age > 10 {self.age = 10}
                }
            }, onDecrement: {
                self.age -= 1
                if self.age < 1 {self.age = 1} 
            })

答案 2 :(得分:0)

我看到了同样的事情。在我看来,苹果绝对是个虫子。正如提到的评论者之一,您可以使用onEditingChanged参数。这应该为您提供所需的所有功能。当绑定变量随步进器输入而变化时,您可以执行操作。看起来像这样:

Stepper(value: $age, in: 1...10, step: 1, onEditingChanged: { didChange in
        // take some action or make a calculation
}) 
{
        Text("Your age is \(age)")
}

答案 3 :(得分:0)

我看到了与在 Xcode 12.5.1 中使用 iOS 14.5 所描述的类似行为。我发现了这个描述错误的开放式雷达:https://openradar.appspot.com/FB7669491

就我而言,在初始化 onIncrement 时,我直接将视图模型中的函数作为 onDecrementStepper 参数传递:

Stepper("Label", onIncrement: viewModel.increment, onDecrement: viewModel.decrement)

基于读取雷达,当前问题是由于将函数视图外作为这些参数的值传递而引起的。将我的代码更改为此修复了我的问题:

Stepper("Label", onIncrement: { viewModel.increment }, onDecrement: { viewModel.decrement })