我有一个设置视图,其中我使用滑块来更改变量。是否有一种方法来执行代码,只有当变量与滑块改变?我尝试了。onchange(),我遇到的问题是,即使我不使用滑块,但用另一个Picker Input更改变量,代码也会执行。
Slider(value: $noteLength, in: 0.1...3.01, step: 0.1)
.onChange(of: noteLength, perform: { value in
defaults.set(value, forKey: "noteLengthEx1")
levelIndex = 4
})
Picker("Level", selection: $levelIndex) {
ForEach(0 ..< levelOptions.count) {
Text(self.levelOptions[$0])}
.onChange(of: levelIndex, perform: {
levelIndex = 1
noteLength = 1.0})
}
代码有点简化,但如果我使用Picker, noteLength将更改为1,因此将执行滑动条的。onchange。那部分我想避免。
谢谢你,祝你有美好的一天。
我们可以使用带有副作用的可计算内联绑定(并且可以完全删除onChange),下面是一个示例
Slider(value: Binding(get: { noteLength },
set: {
// willSet side-effect here // << here !!
noteLenght = $0
// didSet side-effect here // << here !!
}),
in: 0.1...3.01, step: 0.1)
.onChange(of: noteLength, perform: { value in
defaults.set(value, forKey: "noteLengthEx1")
levelIndex = 4
})
实际上你必须使用一个不同的变量,据我所知。实际上,如果你在外部改变noteLength我认为也在调整滑动条。不是吗?
我在Toggle()和Picker()中遇到了同样的问题,并以同样的方式解决了它。花了一点时间来解决这个问题,所以对于任何有同样问题的人:
Toggle("Notes can be the same", isOn: Binding(get: {equalNotes}, set: {
equalNotes = $0
// side-effects here
}))
Picker("tone difference", selection: Binding(get: {toneDifferenceIndex}, set: {
toneDifferenceIndex = $0
// side-effects here
}), content: {
ForEach(0 ..< toneDifferenceOptions.count) {
Text(self.toneDifferenceOptions[$0])
}
})