首页 > 解决方案 > SwiftUI:我有一个列表,当我单击一个对象时,我想进入一个详细视图,我可以在其中选择或取消选择当前对象

问题描述

我可以很好地设置列表,甚至在详细视图 (CardView) 中有一个选择或取消选择按钮。我遇到的问题是当我单击选择时,我想将其添加到数组(cardSelected)中。如果“name3”是列表中的第一个,我如何找出要添加到 cardSelected 数组的索引?我是编程新手,所以正在寻找一些指导。谢谢

import Foundation
import SwiftUI

class Cards: ObservableObject {

    @Published var cardSelected = [gameCards]()
    @Published var playerCards = [gameCards]()
    @Published var playerGameCards = [
        gameCards(id: 1, name: "name1", attack: 92, defence: 49, gameControl: 60, creativity: 72, legend: 4),
        gameCards(id: 2, name: "name2", attack: 87, defence: 40, gameControl: 65, creativity: 80, legend: 2),
        gameCards(id: 3, name: "name3", attack: 43, defence: 93, gameControl: 40, creativity: 45, legend: 3),
        gameCards(id: 4, name: "name4", attack: 88, defence: 51, gameControl: 80, creativity: 92, legend: 5),
        gameCards(id: 5, name: "name5", attack: 85, defence: 51, gameControl: 72, creativity: 81, legend: 3),
        gameCards(id: 6, name: "name6", attack: 91, defence: 38, gameControl: 72, creativity: 89, legend: 5),
        gameCards(id: 7, name: "name7", attack: 34, defence: 95, gameControl: 40, creativity: 50, legend: 5),
        gameCards(id: 8, name: "name8", attack: 86, defence: 63, gameControl: 89, creativity: 84, legend: 4),
        gameCards(id: 9, name: "name9", attack: 90, defence: 30, gameControl: 50, creativity: 83, legend: 5),
        gameCards(id: 10, name: "name10", attack: 32, defence: 92, gameControl: 42, creativity: 32, legend: 4)
    ]
}
struct gameCards: Identifiable {

    let id: Int
    let name: String
    let attack: Int
    let defence: Int
    let gameControl: Int
    let creativity: Int
    let legend: Int


import SwiftUI


struct CardView: View{

    var carddetail: String
    @EnvironmentObject var cardselected: Cards
    @State var cardSelect: Bool = false



    var body: some View{
        ZStack{
            VStack{

                Text(carddetail)
                Spacer()

                if cardSelect == false {

                    Button(action:{

                    self.cardSelect = true

以下 ??是我想添加索引但不知道如何以编程方式找到它的地方。

                    self.cardselected.cardSelected.append(self.cardselected.playerCards[??])
                    print("\([self.carddetail])")
                    print("\([self.cardselected.cardSelected.description])")

                    }){

                        if cardSelect == false {
                        Image(systemName: "star")

                        }

                        if cardSelect == true{
                        Image(systemName: "star.fill")
                        }

                    }
                }

                if cardSelect == true {
                    Button(action:{

                        self.cardSelect = false

                    }){

                        if cardSelect == false {
                            Image(systemName: "star")

                        }

                        if cardSelect == true{
                            Image(systemName: "star.fill")
                        }

                    }

                }


                Spacer()
            }
        }
    }
}


struct ContentView: View {

    @EnvironmentObject var playerList: Cards


    var body: some View {

        NavigationView{

            ZStack{

                Image("Background").resizable().edgesIgnoringSafeArea(.all)

                VStack{

                    Image("FLTitle").resizable().frame(width: 400, height: 100)
                    Spacer()
                    Text("Collected Cards")
                    Text("Choose 5")

                    ScrollView(.horizontal){
                        HStack{
                            Image("Back")
                            Image("Back")
                            Image("Back")
                            Image("Back")
                            Image("Back")

                        }.padding(.horizontal)
                    }

                    Spacer()

                    HStack{
                        NavigationView{

                            List(playerList.playerCards) {gc in
                                NavigationLink(destination: CardView(carddetail: gc.name)){
                                    Text("\(gc.name)")

                                }

                            }.navigationBarTitle("Card detail").font(.body)

                        }.padding(.leading).frame(width: UIScreen.main.bounds.size.width/2, height: 200)
                            Text("Opposition").padding(.trailing).frame(width: UIScreen.main.bounds.size.width/2, height: 200).background(Color.red)

                    }
                    Spacer()

                }

            }

        }.navigationBarTitle("", displayMode: .inline).navigationBarBackButtonHidden(true).navigationBarHidden(true)

    }
}


let data = Cards()
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(data)
    }
}

标签: arrayslistindexingswiftui

解决方案


创建时,List您可以使用ForEach来访问索引,然后传递给CardView

 List {
          ForEach(0..<playerList.playerCards.count) { index in
                 NavigationLink(destination: CardView(carddetail: self.playerList.playerCards[index].name, 
                                                           index: index)) {
                      Text("\(self.playerList.playerCards[index].name)")
                 }
          }.navigationBarTitle("Card detail").font(.body)
 }

推荐阅读