gpt4 book ai didi

swift - 使用带绑定(bind)的 ForEach 循环会导致数组缩小时索引超出范围(SwiftUI)

转载 作者:行者123 更新时间:2023-12-04 21:02:14 28 4
gpt4 key购买 nike

我有一个应用程序

  1. Individually extracts every element of an array (through indices)
  2. Then bind it to a struct that can make use of that single element (viewing and editing)


但是每次数组减小时,它都会导致索引超出范围错误,这不是直接因为我的代码

据我所知,这是因为:在循环使用更改后的数组刷新之后,它之前创建的 View 并没有完全删除,并且仍在尝试访问超出范围的部分。但这就是我自己能弄清楚的一切

这是我的示例代码:
import SwiftUI

struct test: View {
@State var TextArray = ["A","B","C"]
var body:some View {
VStack{
ForEach(TextArray.indices, id: \.self){index in
//Text View
TextView(text: self.$TextArray[index])
.padding()
}
//Array modifying button
Button(action: {
self.TextArray = ["A","B"]
}){
Text(" Shrink array ")
.padding()
}
}
}
}

struct TextView:View {
@Binding var text:String
var body:some View {
Text(text)
}
}




#if DEBUG
struct test_Previews: PreviewProvider {
static var previews: some View {
test()
}
}
#endif

有没有更好的方法来满足上述两个要求而不会导致这个问题或任何方法来规避这个问题?任何回应都非常感谢。

最佳答案

@State似乎无法处理这个,但是 ObservableObject作品。

我不声称知道为什么,除了我的最佳猜测,即 @State通过预测用户想要什么来努力避免重绘,但这样做不支持这一点。

同时ObservableObject重绘每个小改动的所有内容。作品。

class FlashcardData: ObservableObject {
@Published var textArray = ["A","B","C"]

func updateData() {
textArray = ["A","B"]
}
}

struct IndexOutOfRangeView: View {
@ObservedObject var viewModel = FlashcardData()

var body:some View {
VStack{
ForEach(viewModel.textArray.indices, id: \.self){ index in
TextView(text: self.$viewModel.textArray[index])
.padding()
}
Button(action: {
self.viewModel.textArray = ["A","B"]
}){
Text(" Shrink array ")
.padding()
}
}
}
}

struct TextView:View {
@Binding var text:String
var body:some View {
Text(text)
}
}

关于swift - 使用带绑定(bind)的 ForEach 循环会导致数组缩小时索引超出范围(SwiftUI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57631225/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com