SwiftUI中步进器的奇怪行为
我想使用onIncrement和onDecrement在手动(非绑定)模式下使用Stepper视图。当我尝试实现下限和上限时,有一种奇怪的行为,例如年龄值不小于1或大于10 如果您尝试下面的代码,您可以在其值为“1”后按“-”两次。它没有像预期的那样在1以下,但是在另外两次按下“-”按钮之后,它突然被禁用。如果然后按“+”键,则不会发生任何事情。只有在另外两次按下“+”键后,计数器才会按预期反应并转到2 这是虫子吗SwiftUI中步进器的奇怪行为,swiftui,stepper,Swiftui,Stepper,我想使用onIncrement和onDecrement在手动(非绑定)模式下使用Stepper视图。当我尝试实现下限和上限时,有一种奇怪的行为,例如年龄值不小于1或大于10 如果您尝试下面的代码,您可以在其值为“1”后按“-”两次。它没有像预期的那样在1以下,但是在另外两次按下“-”按钮之后,它突然被禁用。如果然后按“+”键,则不会发生任何事情。只有在另外两次按下“+”键后,计数器才会按预期反应并转到2 这是虫子吗 struct StepperTest: View { @State pr
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)")
}
}
}
struct StepperTest:视图{
@国有-私有var年龄=5
var body:一些观点{
VStack{
步进器(“输入您的年龄”,onIncrement:{
如果自身年龄<10岁{
自我年龄+=1
打印(“添加到年龄”)
}
},onDecrement:{
guard self.age>1 else{return}
self.age-=1
打印(“从年龄中减去”)
})
文本(“您的年龄是\(年龄)”)
}
}
}
我想这是一个解释:
///如果尝试递增,onIncrement
将初始化为nil
///值
将无效。同样地,onDecrement
也将被初始化///如果试图减小
值,则设置为nil
将无效
如果你尝试
Stepper("Enter your age", onIncrement: {
print("Adding to age")
}, onDecrement: {
print("Subtracting from age")
})
。。。您将看到步进器进入了与您描述的相同的状态,因此苹果会跟踪步进器视图的重建,如果用户对步进器的操作没有启动重建(即没有效果),它会自动禁用
另一个问题是为什么不立即…在递增后检查并重置值似乎有效:
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}
})
Stepper(“输入您的年龄”),onIncrement:{
自我年龄+=1
如果self.age>10{self.age=10}
}
},onDecrement:{
self.age-=1
如果self.age<1{self.age=1}
})
我也看到了同样的事情。对我来说,这绝对像是苹果上的一只虫子。正如前面提到的一位评论者所说,您可以使用onEditingChanged参数。这将为您提供所需的所有功能。当绑定变量随步进器输入变化时,您可以采取行动。看起来是这样的:
Stepper(value: $age, in: 1...10, step: 1, onEditingChanged: { didChange in
// take some action or make a calculation
})
{
Text("Your age is \(age)")
}
你为什么不想用绑定来做这个?@MojtabaHosseini:因为我想完全控制什么?您已经可以访问编辑更改
,并且可以检测到触摸了开关键。您还需要什么?主要原因是,我想使用一种类似Redux的体系结构,其中状态仅由单独模块中的操作更改。使用绑定,状态在各种视图中被修改。这称为单向数据流体系结构,与此没有冲突。我不完全理解您将如何以这种方式使用它。我希望有两个处理程序onIncrement和onDecrement,以及两个属性来启用/禁用加号和减号按钮……这是苹果公司的问题),但这是一个记录在案的行为。我认为这是一个bug。即使我的onIncrement
和ondescrement
中没有任何if/else逻辑,我也会有同样的古怪行为。它只是停止并将“+”或“-”变灰。然后,如果你点击了另一个在错误的方向。这篇评论在语法上很糟糕,令人费解。