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

创建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)
}

最新更新