Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI中步进器的奇怪行为_Swiftui_Stepper - Fatal编程技术网

SwiftUI中步进器的奇怪行为

SwiftUI中步进器的奇怪行为,swiftui,stepper,Swiftui,Stepper,我想使用onIncrement和onDecrement在手动(非绑定)模式下使用Stepper视图。当我尝试实现下限和上限时,有一种奇怪的行为,例如年龄值不小于1或大于10 如果您尝试下面的代码,您可以在其值为“1”后按“-”两次。它没有像预期的那样在1以下,但是在另外两次按下“-”按钮之后,它突然被禁用。如果然后按“+”键,则不会发生任何事情。只有在另外两次按下“+”键后,计数器才会按预期反应并转到2 这是虫子吗 struct StepperTest: View { @State pr

我想使用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)")
        }
    }
}
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逻辑,我也会有同样的古怪行为。它只是停止并将“+”或“-”变灰。然后,如果你点击了另一个在错误的方向。这篇评论在语法上很糟糕,令人费解。