3

我想使用 onIncrement 和 onDecrement 在手动(非绑定)模式下使用 Stepper 视图。当我尝试实现下限和上限时,会有一个奇怪的行为,例如。年龄值不低于 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)")
        }
    }
}
4

4 回答 4

1

递增后检查和重置值似乎有效:

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} 
            })
于 2020-01-06T02:15:09.613 回答
0

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

在我的情况下,我在初始化时直接将视图模型中的函数作为onIncrementand参数传递:onDecrementStepper

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

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

Stepper("Label", onIncrement: { viewModel.increment }, onDecrement: { viewModel.decrement })
于 2021-08-08T00:31:36.577 回答
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)")
}
于 2020-08-17T19:31:18.633 回答
0

我认为这里是解释:

///如果尝试增加 ///将无效,onIncrement将被初始化。同样,将被初始化 ///如果尝试递减将无效。nil
valueonDecrement
nilvalue

如果你试试

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

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

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

于 2019-11-20T18:47:54.017 回答