在swift中使用滑块时是否有方法调用函数?



我有一个设置视图,其中我使用滑块来更改变量。是否有一种方法来执行代码,只有当变量与滑块改变?我尝试了。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])
}
})

最新更新