【发布时间】:2020-06-15 10:59:24
【问题描述】:
我找不到从 ForEach 循环中使用的动态数组中删除的方法。我一直在寻找没有运气。许多答案使用 List 或在其 ForEach 中没有绑定。而且我不想使用列表,因为它很难完全定制它的设计。
以下是从数组中添加和删除元素的示例代码。该数组用于显示玩家的动态列表。
在解开 ForEach 循环中的可选项后,移除一个播放器会产生一个超出范围的索引。
import SwiftUI
struct GameRecapView: View {
@State private var game = Game(players: [Player(name: "Steph"),Player(name: "Kim")])
@State private var shape = Shape.circle
var body: some View {
VStack {
ForEach(self.game.players ,id: \.id) { player in
PlayerView(
player: self.$game.players[self.game.players.firstIndex(where: {$0.id == player.id})!],
shape: self.$shape)
}
Spacer()
Button(action: {
self.toggleShape()
}) {
Text("Change shape")
}
HStack {
Button(action: {
self.addPlayer(player: Player(name: "Eddye"))
}) {
Text("+")
}
Button(action: {
self.removeLastPlayer()
}) {
Text("-")
}
}
}
}
func toggleShape(){
if self.shape == .circle {
self.shape = .square
} else {
self.shape = .circle
}
}
func addPlayer(player : Player) {
self.game.players.append(player)
}
func removeLastPlayer(){
self.game.players.removeLast()
}
func removeItems(at offsets: IndexSet) {
self.game.players.remove(atOffsets: offsets)
}
}
struct PlayerView: View {
@Binding var player : Player
@Binding var shape : Shape
var letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t"]
var body: some View {
VStack {
ZStack{
Text(String(self.player.name.first!.uppercased()))
if shape == .square {
Rectangle().stroke().frame(width: 50, height: 50)
} else {
Circle().stroke().frame(width: 50, height: 50)
}
}
Button(action: {
self.player.name = self.letters.randomElement()!
}) {
Text("Change Name")
}
}
}
}
struct Game {
var players : [Player]
}
struct Player : Identifiable {
var id = UUID()
var name : String
}
enum Shape {
case
circle ,
square
}
struct GameRecapView_Previews: PreviewProvider {
static var previews: some View {
GameRecapView()
}
}
【问题讨论】: