SwiftUI:删除ForEach中的最后一行

时间:2020-04-25 23:54:31

标签: ios swiftui

我正在尝试删除ForEach中的行。删除最后一行总是会引发索引超出范围异常。删除任何其他行都不会。

ForEach(Array(player.scores.enumerated()), id: \.element) { index, score in
    HStack {
        if self.isEditSelected {
            Button(action: {
                self.player.scores.remove(at: index)
            }, label: {
                Image("delete")
            })
        }        
        TextField("\(score)", value: self.$player.scores[index], formatter: NumberFormatter())
    }
}

我尝试使用ForEach(player.indices...)ForEach(player.scores...),但遇到相同的问题。

在我看来,崩溃发生在self.$player.scores[index],因为将索引硬编码为除最后一行有效以外的任何值。

有人知道如何解决此问题吗?或者,如果有更好的方法。

3 个答案:

答案 0 :(得分:3)

这是固定的

<div *ngFor="let item of name">
    <h2>Company: {{item.fields?.company}}</h2>
    <p>Description: {{item.fields?.description}}</p>
    <p>Type: {{item.fields?.type}}</p>
    <p>Rate: {{item.fields?.rate}}</p>
</div>

答案 1 :(得分:0)

基于@Asperi答案

public extension Binding where Value: Equatable {
    static func proxy(_ source: Binding<Value>) -> Binding<Value> {
            self.init(
                get: { source.wrappedValue },
                set: { source.wrappedValue = $0 }
            )
    }
}

您可以按以下方式使用它:

TextField("Name", text: .proxy($variable))

答案 2 :(得分:0)

Xcode 13.0 beta 引入了一种新方法,可以在集合元素和 ForEach / List 构建的视图之间建立双向绑定。 此方法修复了与删除最后一行相关的崩溃。

struct Score: Identifiable {
    let id = UUID()
    var value: Int
}

struct Player {
    var scores: [Score] = (1...10).map {_ in .init(value: Int.random(in: 0...25))}
}

struct BindingTest: View {
    @State private var player = Player()

    var body: some View {
        List {
            ForEach($player.scores) { $score in
                HStack {
                    TextField("\(score.value)", value: $score.value,
                        formatter: NumberFormatter())
                }
            }
            .onDelete { player.scores.remove(atOffsets: $0)}
        }
    }
}