选择器中的 SwiftUI 和枚举

Posted

技术标签:

【中文标题】选择器中的 SwiftUI 和枚举【英文标题】:SwiftUI and enum in picker 【发布时间】:2021-02-14 20:19:55 【问题描述】:

我在游乐场工作,试图学习 SwiftUI。我正在创建一个视图,其中包含一个标签、一个文本字段、用于显示选取器和选取器值的文本。

我目前拥有的是这个

import UIKit
import PlaygroundSupport
import SwiftUI

enum Units: String, CaseIterable, Identifiable

    case Inches = "in"
    case Millimeters = "mm"
    case Centimeters = "cm"
    
    var id: String  self.rawValue 


struct VariableView: View

    let name: String
    let labelValue: String
    @State private var inputValue = ""
    @State private var inputUnits = Units.Inches
    
    init(name: String, label: String)
    
        self.name = name
        labelValue = label
    
    
    var body: some View
    
        VStack(alignment: .leading, spacing: 0)
        
            Text(self.labelValue)
                .font(.subheadline)
                .frame(width: .infinity, alignment: .leading)
                .padding(.horizontal, 4)
            HStack
            
                TextField("Value", text: $inputValue)
                    .padding(.horizontal, 4)
                    .keyboardType(.numbersAndPunctuation)
                Text(inputUnits.id)
                Picker("...", selection: $inputUnits)
                
                    /*
                    Text("Inches").tag(Units.Inches)
                    Text("Millimeters").tag(Units.Millimeters)
                    Text("Centimeters").tag(Units.Centimeters)
                     */
                    ForEach(Units.allCases)
                    
                        unit in Text(unit.rawValue.capitalized)
                    
                
                .padding(10)
                .pickerStyle(MenuPickerStyle())
            
            Divider()
             .frame(height: 1)
             .padding(.horizontal, 30)
             .background(Color.black)
        
    


// Make a SwiftUI view
struct ContentView: View

    var body: some View
    
        VariableView(name: "value1", label: "Value 1")
        VariableView(name: "value1", label: "Value 2")
        VariableView(name: "value1", label: "Value 3")
        VariableView(name: "value1", label: "Value 4")
        VariableView(name: "value1", label: "Value 5")
    


// Make a UIHostingController
let viewController = UIHostingController(rootView: ContentView())

// Assign it to the playground's liveView
PlaygroundPage.current.liveView = viewController

当我单击“...”时,它会崩溃。变为黑色并停止运行。没有错误,只是停止。

如果我使用三个文本行(当前已注释掉)而不是 ForEach,它可以工作 - 但最终我需要能够为每个输入动态设置允许的单位,所以我需要 ForEach 工作。

【问题讨论】:

这看起来像是 Playground 限制(可能是选择器菜单样式)。此代码在模拟器中运行良好。 尝试模拟器或真实设备 - 在这里可以正常工作。我认为这是 Playground 的错误。 谢谢大家。我以为我快疯了。可以在模拟器中运行游乐场吗? @jbmillard 的答案有用吗? 【参考方案1】:

inputTypes 的类型是 Units,硬编码 Texts 上的标签与该类型匹配。在 ForEach 中,标签是 Units.rawValue,类型是 String。看看这是否适用于 Playground:

struct PickFromEnumView: View 
    @State private var inputUnits = Units.none
    
    var body: some View 
        VStack 
            Picker(inputUnits.rawValue, selection: $inputUnits) 
                ForEach(Units.allCases)  unit in
                    unit.label.tag(unit)
                
            
            .padding(10)
            .pickerStyle(MenuPickerStyle())
            Spacer()
        
    
    
    enum Units: String, CaseIterable, Identifiable
    
        case none = "…"
        case inches = "in"
        case millimeters = "mm"
        case centimeters = "cm"
        
        var id: String  self.rawValue 
        
        var label : some View 
            switch(self) 
            case .none: return Label("…", systemImage: "circle")
            case .inches: return Label("inch", systemImage: "1.circle")
            case .millimeters: return Label("millimeter", systemImage: "2.circle")
            case .centimeters: return Label("centimeter", systemImage: "3.circle")
            
        
    

【讨论】:

谢谢你,但它也崩溃了。我把这个归结为游乐场的虫子。我让它在模拟器中工作。

以上是关于选择器中的 SwiftUI 和枚举的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Picker 填充问题 - 选择器中的 ForEach 循环不填充

如何知道用户在 SwiftUI 中的日期选择器中触摸了哪一天

从 SwiftUI 颜色选择器中获取价值

如何增加 SwiftUI 选择器中显示的最大行数?

SwiftUI - 使用带有枚举的选择器和提供的值并返回正确的 tag()

将核心数据对象提取到 SwiftUI 选择器中