我想使用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)")
}
}
}
答案 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
时,我直接将视图模型中的函数作为 onDecrement
和 Stepper
参数传递:
Stepper("Label", onIncrement: viewModel.increment, onDecrement: viewModel.decrement)
基于读取雷达,当前问题是由于将函数视图外作为这些参数的值传递而引起的。将我的代码更改为此修复了我的问题:
Stepper("Label", onIncrement: { viewModel.increment }, onDecrement: { viewModel.decrement })