Enums 如何使用SwiftUI中的滑块更改以枚举为类型的变量?
我在模型Enums 如何使用SwiftUI中的滑块更改以枚举为类型的变量?,enums,swiftui,slider,Enums,Swiftui,Slider,我在模型MyModel中有一个变量myValue。在本例中,我希望myValue仅为4个值中的一个(现实生活中为50个值,以防影响答案)。假设我希望myValue是这个数组中的一个值:让myArray=[4,2,7,5] 我想一个滑块能够改变我的价值。但是,滑块仅接受Double作为类型 我正在努力解决这个问题,但到目前为止,我只提出了一个有点复杂的解决方案 //类型 枚举MyType:Int,CaseIterable,Codable{ 案例0=4 案例一=2 案例二=7 案例三=5 var a
MyModel
中有一个变量myValue
。在本例中,我希望myValue
仅为4个值中的一个(现实生活中为50个值,以防影响答案)。假设我希望myValue是这个数组中的一个值:让myArray=[4,2,7,5]
我想一个滑块能够改变我的价值。但是,滑块仅接受Double作为类型
我正在努力解决这个问题,但到目前为止,我只提出了一个有点复杂的解决方案
//类型
枚举MyType:Int,CaseIterable,Codable{
案例0=4
案例一=2
案例二=7
案例三=5
var asIndex:双{
切换自身{
case.zero:返回0
案例一:返回1
案例二:返回2
案例三:返回3
}
}
}
//模型
结构MyModel:可编码{
变量myValue:MyType=.zero
}
//观点
结构MyView:View{
@绑定var-myModel:myModel
var body:一些观点{
滑块(值:Binding.init)(
get:{()->Double返回myModel.myValue.asIndex},
集合:{newValue in
如果让unwrappedMyType=MyType(rawValue:Int(newValue)){myModel=myModel(myValue:unwrappedMyType)}
),在:0…3)
Text(\(myModel.myValue.rawValue)“作为字符串)//4、2、7或5,具体取决于滑块设置为值0、1、2或3
}
}
结构ContentView:View{
@状态变量myModel:myModel=myModel()
var body:一些观点{
MyView(myModel:$myModel)
.框架(宽度:300,高度:100)
}
}
它几乎可以工作了,但滑块无法设置。我做错了什么?有更简单或更好的方法吗?默认情况下,
滑块的范围是连续的,所以映射到enum的重要部分是给它一个步骤
这是可能的解决办法。使用Xcode 12.4/iOS 14.4进行测试
以下仅为修改后的零件:
enum MyType: Int, CaseIterable, Codable {
case zero = 4
case one = 2
case two = 7
case three = 5
init(index: Double = 0) {
if let type = Self.allCases.first(where: { $0.asIndex == index }) {
self = type
} else {
self = .zero
}
}
var asIndex : Double {
switch self {
case .zero: return 0
case .one: return 1
case .two: return 2
case .three: return 3
}
}
}
// VIEWS
struct MyView: View {
@Binding var myModel: MyModel
var body: some View {
Slider(value: Binding(
get: { myModel.myValue.asIndex },
set: { myModel.myValue = MyType(index: $0) }
), in: 0...3, step: 1) // give step !!
Text("\(myModel.myValue.rawValue)" as String) // 4, 2, 7 or 5 depending on the slider being set to values 0,1,2 or 3
}
}
如果我的自定义滑块没有步骤,有没有简单的破解方法?或者我真的应该在滑块中实现一个步进机制吗?