arrays - 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)
}
推荐阅读
- javascript - 如何不让用户直接从 AJAX 使用的浏览器访问 php 文件?
- python - 熊猫在第一列合并
- regex - 字母数字和单个空格的正则表达式
- laravel - 持续集成 - 不要使用 bitbucket 管道将 laravel .env 文件移动到 azure
- python - Windows CMD 使用 python 的 sys.stdout 在打印行的末尾添加一个随机数
- rest - Rest API:命名约定
- amazon-web-services - AWS Kinesis、Lambda 和 VPC 端点
- php - Gloudemans 购物车内容在重定向到视图时为空,但使用 dd() 可见
- java - retrofit2.4 + 适配器-rxjava2 + proguard
- powershell - 如何使用 PowerShell 将可选参数传递给对象方法?