(SwiftUI) 如何让用户从 Picker 中选择一个值,然后对其进行编辑?

(SwiftUI) How can I let user to pick a value from Picker, and then edit it?

我是 swiftUI 的新手,不完全了解变量的工作原理。

我想制作一个选择器,然后当用户选择其中一种口味时,他可以在下方编辑该口味的数量,因此变量数量也会发生变化(因此我可以在另一个中显示当前数量查看)。

如您现在所见,这些值是随机的 ( 1 - 6 ),但我想以某种方式让用户对它们中的每一个进行更改,具体取决于用户选择的值。

在您看到(当前库存:)的地方,它也应该显示所选口味的库存。

这是我的代码:


struct UpdateView: View {

    var flavours = ["Romantic Suicide", "Project X", "Psycho", "Covid-19", "Dramalama", "Luxury"]
    @State private var selectedFlavour = "Romantic Suicide"
    
    var romanticSuicide = 3
    var projectX = 2
    var psycho = 1
    var covid19 = 5
    var dramalama = 4
    var luxury = 6

    var body: some View {
        
        
        
        
        ZStack {
            
            Image("BackgroundImage").resizable().scaledToFill().edgesIgnoringSafeArea(.all).opacity(0.2)
            

            VStack {
                        Text("Select flavour").foregroundColor(.white).font(Font.custom("BebasNeue", size: 27))

                        Picker("Please choose a flavour", selection: $selectedFlavour) {
                            ForEach(flavours, id: \.self) {
                                Text([=10=])
                            }
                        }
                Text("\(selectedFlavour) current stock: 1").foregroundColor(.white).font(Font.custom("BebasNeue", size: 22))}
            
        }.background(.black)
        
    }
}
            
            
            
            
            
        
    


struct UpdateView_Previews: PreviewProvider {
    static var previews: some View {
        UpdateView()
    }
}

有人可以解释一下我该怎么做吗?提前致谢。

你可以做的是创建一个名为“FlavourItem”的结构,例如包含 2 个变量:flavor 和 amount。

struct FlavourItem {
    var flavour: String
    var amount: Int
}

然后,除了为 selectedFlavour 创建一个 @State 变量外,您还可以为 FlavourItem 创建一个。

@State var flavourItem: FlavourItem

然后您可以创建 UI 来要求用户输入他想要的内容并将其存储在 FlavourItem 对象中。

您可以从该代码开始:

import SwiftUI

struct FlavourItem: Hashable { // Neaded to use Picker
var flavour: String
var amount: Double

}

struct ContentView: View {

    // Array of FlavourItems
    var flavours: [FlavourItem] = [
        FlavourItem(flavour: "Romantic Suicide", amount: 1),
        FlavourItem(flavour: "Project X", amount: 2),
        FlavourItem(flavour: "American Psycho", amount: 3),
        FlavourItem(flavour: "Covid 19", amount: 4),
        FlavourItem(flavour: "Dramalama", amount: 5),
        FlavourItem(flavour: "Luxury", amount: 6)
    ]

    @State private var selectedFlavour: FlavourItem = FlavourItem(flavour: "Romantic Suicide", amount: 1)

    var body: some View {
        VStack {
            VStack {
                Text("Select flavour").foregroundColor(.white).font(Font.custom("BebasNeue", size: 27))

                Text("Select flavour").foregroundColor(.white).font(Font.custom("BebasNeue", size: 27))

                Picker("Select flavour", selection: $selectedFlavour) {
                    ForEach(flavours, id: \.self) {
                        Text("\([=12=].flavour)")
                    }
                }.clipped()

                Text("\(selectedFlavour.flavour) current stock: \(selectedFlavour.amount)").font(Font.custom("BebasNeue", size: 22))

                Slider(value: $selectedFlavour.amount, in: 0...20)
                Text("Current flavour value: \(selectedFlavour.amount)")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}