SwiftUI 中 Stepper 的奇怪行为

G. *_*arc 7 stepper swiftui

我想使用 onIncrement 和 onDecrement 在手动(非绑定)模式下使用步进视图。当我尝试实现下限和上限时,会出现奇怪的行为,例如。年龄值不低于 1 或高于 10。

如果您尝试以下代码,则可以在其值已为“1”后按两次“-”。它并没有像预期的那样低于 1,但是在再按两次之后,“-”按钮突然被禁用。如果您随后按“+”,则不会发生任何事情。仅在再按 2 次“+”后,计数器才会按预期做出反应并变为 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)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 1

我想这里有解释:

///如果尝试增加 ///将不会有任何效果,onIncrement则将被初始化。同样,如果尝试递减没有效果, 则 ///将被初始化为。nil
valueonDecrement
nilvalue

如果你试试

Stepper("Enter your age", onIncrement: {
    print("Adding to age")
}, onDecrement: {
    print("Subtracting from age")
})
Run Code Online (Sandbox Code Playgroud)

...您会看到步进器进入相同的状态,正如您所描述的,因此Apple跟踪步进器视图的重建,如果用户对步进器的操作没有启动重建(即没有效果),它会自行禁用。

另一个问题是为什么不立即...

  • 我认为这是一个错误。即使我的“onIncrement”和“onDecrement”中没有任何 if/else 逻辑,我也会得到同样的奇怪行为。它只是停止并使“+”或“-”变灰。然后,如果你点击另一个,就会走向错误的方向。该评论语法错误且难以理解。 (4认同)