ios - SwiftUI 为什么 Picker 上的输入不起作用?
问题描述
我对 SwiftUI 很陌生,我需要社区的帮助来理解为什么在以下代码中选择任何 Picker 选项似乎都不起作用,要么是不可选择的,因此不会触发任何操作,要么它被选中并且它不会触发任何事情。
非常感谢您让我知道下划线的概念。
德沃
import SwiftUI
struct ContentView: View {
@State private var measureToConvert = ""
@State private var conversionFromMeasure = "km"
@State private var convertedToMeasure = "m"
let measure = ["m", "km", "ft", "yd", "mi"]
func convertInMillimeters(input: String, number: String) -> Double {
var value: Double = 0
if let realNumber = Double(number) {
switch input {
case "m":
let conversion = (Double(realNumber) * 1_000)
value = conversion
case "km":
let conversion = (Double(realNumber) * 1_000_000)
value = conversion
case "ft":
let conversion = (Double(realNumber) * 304.8)
value = conversion
case "yd":
let conversion = (Double(realNumber) * 914.4)
return conversion
case "mi":
let conversion = (Double(realNumber) * 1_609_344)
value = conversion
default:
let conversion = -2.0
value = conversion
}
}
print("value in millimeters is \(value)")
return value
}
func convertToNewMeasure(input: String, number: Double) -> Double {
var value: Double = 0
switch input {
case "m" :
let conversion = (number / 1_000)
value = conversion
case "km":
let conversion = (number / 1_000_000)
value = conversion
case "ft":
let conversion = (number / 304.8)
value = conversion
case "yd":
let conversion = (number / 914.4)
return conversion
case "mi":
let conversion = (number / 1_609_344)
value = conversion
default:
let conversion = -1.0
value = conversion
}
print("value converted is \(value)")
return value
}
var inMillimeters : Double {
return convertInMillimeters(input: conversionFromMeasure, number: measureToConvert)
}
var result: Double {
return convertToNewMeasure(input: convertedToMeasure, number: inMillimeters)
}
var body: some View {
NavigationView{
Form{
Section(header: Text("Value to convert:")){
TextField("Enter a measure", text: $measureToConvert).keyboardType(.decimalPad)
}
Section(header: Text("Select input measure")){
Picker("From", selection: $conversionFromMeasure) {
ForEach(0 ..< measure.count){
Text("\(self.measure[$0])")
}
}.pickerStyle(SegmentedPickerStyle())
}
Section(header: Text("Select output measure")){
Picker("To", selection: $convertedToMeasure) {
ForEach(0 ..< measure.count) {
Text("\(self.measure[$0])")
}
}.pickerStyle(SegmentedPickerStyle()) }
Section(header: Text("Converted value")){
Text("\(result, specifier: "%.2f")")
}
}
.navigationBarTitle("Measure Converter")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
解决方案
当使用带有这几个选项的选择器时,使用枚举来存储值非常方便,您还可以使用枚举来存储您的函数并返回您想要的结果。您可以在此处了解有关枚举的更多信息
创建枚举后,使其符合 CaseIterable,这将为您提供所有案例的数组,然后您将在 ForEach 中使用这些案例。
您还给它一个 rawValue,它将作为填充每个选择器选项的内容。很清楚我在那里的代码中做了什么。
import SwiftUI
struct ContentView: View {
enum Unit: String, CaseIterable {
case meters = "m"
case kilometers = "km"
case feet = "ft"
case yards = "yd"
case miles = "mi"
}
@State private var unitSelection: Unit = .meters
@State private var measureToConvert = ""
@State private var conversionFromMeasure = "km"
@State private var convertedToMeasure = "m"
let measure = ["m", "km", "ft", "yd", "mi"]
func convertInMillimeters(input: String, number: String) -> Double {
var value: Double = 0
if let realNumber = Double(number) {
switch input {
case "m":
let conversion = (Double(realNumber) * 1_000)
value = conversion
case "km":
let conversion = (Double(realNumber) * 1_000_000)
value = conversion
case "ft":
let conversion = (Double(realNumber) * 304.8)
value = conversion
case "yd":
let conversion = (Double(realNumber) * 914.4)
return conversion
case "mi":
let conversion = (Double(realNumber) * 1_609_344)
value = conversion
default:
let conversion = -2.0
value = conversion
}
}
print("value in millimeters is \(value)")
return value
}
func convertToNewMeasure(input: String, number: Double) -> Double {
var value: Double = 0
switch input {
case "m" :
let conversion = (number / 1_000)
value = conversion
case "km":
let conversion = (number / 1_000_000)
value = conversion
case "ft":
let conversion = (number / 304.8)
value = conversion
case "yd":
let conversion = (number / 914.4)
return conversion
case "mi":
let conversion = (number / 1_609_344)
value = conversion
default:
let conversion = -1.0
value = conversion
}
print("value converted is \(value)")
return value
}
var inMillimeters : Double {
return convertInMillimeters(input: conversionFromMeasure, number: measureToConvert)
}
var result: Double {
return convertToNewMeasure(input: convertedToMeasure, number: inMillimeters)
}
var body: some View {
NavigationView{
Form{
Section(header: Text("Value to convert:")){
TextField("Enter a measure", text: $measureToConvert).keyboardType(.decimalPad)
}
Section(header: Text("Select input measure")){
Picker("From", selection: $unitSelection) {
ForEach(Unit.allCases, id: \.self){ unit in
Text(unit.rawValue)
}
}.pickerStyle(SegmentedPickerStyle())
}
Section(header: Text("Select output measure")){
Picker("To", selection: $convertedToMeasure) {
ForEach(0 ..< measure.count) {
Text("\(self.measure[$0])")
}
}.pickerStyle(SegmentedPickerStyle()) }
Section(header: Text("Converted value")){
Text("\(result, specifier: "%.2f")")
}
}
.navigationBarTitle("Measure Converter")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
推荐阅读
- app-startup - TomEE 在初始化虚拟目录时花费大量时间
- ios - 如何从 UIActivityViewController swift 打开一项
- javascript - Ajax 帖子和 Fetch 帖子
- docker - 使用主机网络时无法从 Internet 访问 docker 容器
- python - 从 django orm 获取硬查询。Django 休息框架
- c# - itext hml2pdf:在 2.1.0 版之后,在源 html 中声明字体不起作用
- c++ - 在 C++ 中使用 UTF-8 解析 XML
- ipywidgets - ipywidgets:GridspecLayout 网格间隙似乎不起作用
- json - 使用结构读取 JSON
- vb6 - 组件 MSCOMCTL.OCX 或其依赖项之一未正确注册