我正在尝试删除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]
,因为将索引硬编码为除最后一行有效以外的任何值。
有人知道如何解决此问题吗?或者,如果有更好的方法。
答案 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)
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)}
}
}
}