iOS15 SwiftUI如何关联两个取值范围滑块 防止最小值超过最大值
解决方案
有两种常用实现方式,你可以根据交互需求选择:
方案1:限制滑块可选范围(推荐,交互更顺滑)
直接修改两个滑块的取值区间,让用户无法滑到非法数值:
- 最小值滑块的范围改为
98...maximum,永远不能超过当前最大值 - 最大值滑块的范围改为
minimum...1000000,永远不能低于当前最小值
修改后的完整代码如下:
@State private var minimum: Double = 98.0 @State private var maximum: Double = 1000000.0 var filteredProducts: [Product] var body: some View { List { Section(header: Text("Filters")){ DisclosureGroup("Price range") { // 最小值滑块上限设置为当前最大值 Slider(value: $minimum, in: 98...maximum) { Text("\(minimum)") } minimumValueLabel: { Text("min") } maximumValueLabel: { Text("\(minimum, specifier: "%.0f")") } // 最大值滑块下限设置为当前最小值 Slider(value: $maximum, in: minimum...1000000) { Text("\(maximum)") } minimumValueLabel: { Text("max") } maximumValueLabel: { Text("\(maximum, specifier: "%.0f")") } } } } } // 顺便修正原有逻辑的bug:初始minimum为98,原有判断minimum==0永远不会触发,可调整为匹配初始值 var slideresults: [Product] { if minimum == 98 && maximum == 1000000.0 { return filteredProducts } else { return filteredProducts.filter { $0.price > minimum && $0.price < maximum } } }
方案2:值变化时自动修正
如果你需要保留滑块的完整滑动范围,只在数值非法时自动修正,可以用onChange修饰符监听数值变化:
Slider(value: $minimum, in: 98...1000000) { Text("\(minimum)") } minimumValueLabel: { Text("min") } maximumValueLabel: { Text("\(minimum, specifier: "%.0f")") } .onChange(of: minimum) { newValue in if newValue > maximum { maximum = newValue } } Slider(value: $maximum, in: 98...1000000) { Text("\(maximum)") } minimumValueLabel: { Text("max") } maximumValueLabel: { Text("\(maximum, specifier: "%.0f")") } .onChange(of: maximum) { newValue in if newValue < minimum { minimum = newValue } }
内容的提问来源于stack exchange,提问作者RichStwrt
相关产品推荐
相关产品推荐

