当前位置: 首页 > 知识库问答 >
问题:

为什么拾取器上的输入不起作用?

楚志强
2023-03-14

我是SwiftUI的新手,我需要社区的帮助来理解为什么在下面的代码中,任何选择器选项的选择似乎都不起作用,要么是不可选择的,因此不会触发任何操作,要么是被选择的,并且不会触发任何操作。

非常感谢提前让我知道下划线的概念。

德沃

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()
    }
}

共有2个答案

王磊
2023-03-14

您可以通过更改以下内容来使选择器工作:

ForEach(0 ..< measure.count){
    Text("\(self.measure[$0])")
}

对此:

ForEach(measure, id: \.self) {
    Text($0)
}

所以这两个部分应该是:

Section(header: Text("Select input measure")){
    Picker("From", selection: $conversionFromMeasure) {
        ForEach(measure, id: \.self) {
            Text($0)
        }
    }
    .pickerStyle(SegmentedPickerStyle())
}
            
Section(header: Text("Select output measure")){
    Picker("To", selection: $convertedToMeasure) {
        ForEach(measure, id: \.self) {
            Text($0)
        }
    }.pickerStyle(SegmentedPickerStyle())
}
            
邬令
2023-03-14

当使用一个具有这几个选项的选择器时,使用枚举来存储值是非常方便的,您也可以使用枚举来存储函数并返回您想要的结果。您可以在这里了解有关枚举的更多信息

一旦您创建了枚举,然后使它符合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()
    }
}
 类似资料:
  • 但是,如果运行,则筛选后的文件不会拾取它: 包含: 具有: 中的内部版本号配置: 我不够了解Maven。运行资源“目标”不应该也获得属性吗?

  • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么

  • 问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。

  • 问题内容: 我现在有点困惑。我尝试过: 并得到: 但是,我想要: 我的代码有什么问题? 问题答案: 您没有将其分配给。字符串是 不可变的 。 您需要将其分配回。

  • 问题内容: 我正在尝试这样做: 第一行有效: 但是接下来的两个: 和 只是输出 为什么? 问题答案: 因为你需要加入同,只是列出了内容直接,内容不具有完整路径。 范例- 如果未提供完整路径,则在当前目录中搜索,因此当您给出时,将获得正确的列表。 范例- 假设某个文件夹-具有文件-并在其中。 当您执行-时,返回的列表类似于- 即使您在其中提供绝对路径,列表中返回的文件也将具有指向目录的相对路径。您将

  • 我想知道两次当地约会之间的时间。我使用了下面的代码: 我有以下错误: