SwiftUI 删除 ForEach 子视图中的数组条目
SwiftUI remove array entries within ForEach subviews
我是 IOS 开发的新手,所以如果我以完全不正确的方式使用代码,请多多包涵。
我使用 swiftui 2,我的问题是我的数据结构中有一个数组,其中包含我想通过 ForEach 在另一个视图中呈现的信息。到目前为止,这是可行的,但是如果我更改其中一个子视图中的数组,则会出现 index out of range error.
这是示例数据结构:
struct Test {
var id: String
var array : Array<String>
}
环境对象:
class DBhandler: ObservableObject {
@Published var arrays: Test
init(arrays: Test) {
self.arrays = arrays
}
}
应用程序文件:
@main
struct DummyApp: App {
@ObservedObject var dbhandler = DBhandler(arrays: Test(id: "1", array: ["Car", "Bus", "Train"]))
var body: some Scene {
WindowGroup {
ContentView().environmentObject(dbhandler)
}
}
}
MainView:
struct ContentView: View {
@EnvironmentObject var dbhandler: DBhandler
var body: some View {
VStack{
ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
SubView(index: index)
}
}
}
}
和子视图:
struct SubView : View {
@EnvironmentObject var dbhandler: DBhandler
let index: Int
var body: some View {
VStack{
Text(dbhandler.arrays.array[index]) <--- here's the index out of range error
Button(action: {
dbhandler.arrays.array.remove(at: index)
}, label: {
Text("Remove object")
})
}
}
}
我的假设是 ForEach 不是指最新的 dbhandler.arrays.array.indices 而是指旧的存储的,但我不知道如何绕过它。
你们中有人知道我该如何解决这个问题吗?
非常感谢任何帮助:)
您可以通过在 SubView index < dbhandler.arrays.array.count 中添加一个检查来修复崩溃,如果索引超出范围,它将不会呈现视图
struct SubView : View {
@EnvironmentObject var dbhandler: DBhandler
let index: Int
var body: some View {
VStack{
if index < dbhandler.arrays.array.count{
Text(dbhandler.arrays.array[index]) //<--- here's the index out of range error
Button(action: {
dbhandler.arrays.array.remove(at: index)
}, label: {
Text("Remove object")
})
}
}
}
}
对于有同样问题的人。我已经找到了实现它的方法。由于 ForEach
存储原始数组并且未引用原始数组,因此可能的解决方法是强制 ForEach
更新自身。你可以这样做:
struct ContentView: View {
@EnvironmentObject var dbhandler: DBhandler
@State var dummyVar : Int = 0
var body: some View {
VStack{
ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
SubView(index: index, dummyVar : dummyVar)
}.id(dummyVar)
}
}
}
在 SubView 中,您只需将 dummyVar 增加 1。
我是 IOS 开发的新手,所以如果我以完全不正确的方式使用代码,请多多包涵。
我使用 swiftui 2,我的问题是我的数据结构中有一个数组,其中包含我想通过 ForEach 在另一个视图中呈现的信息。到目前为止,这是可行的,但是如果我更改其中一个子视图中的数组,则会出现 index out of range error.
这是示例数据结构:
struct Test {
var id: String
var array : Array<String>
}
环境对象:
class DBhandler: ObservableObject {
@Published var arrays: Test
init(arrays: Test) {
self.arrays = arrays
}
}
应用程序文件:
@main
struct DummyApp: App {
@ObservedObject var dbhandler = DBhandler(arrays: Test(id: "1", array: ["Car", "Bus", "Train"]))
var body: some Scene {
WindowGroup {
ContentView().environmentObject(dbhandler)
}
}
}
MainView:
struct ContentView: View {
@EnvironmentObject var dbhandler: DBhandler
var body: some View {
VStack{
ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
SubView(index: index)
}
}
}
}
和子视图:
struct SubView : View {
@EnvironmentObject var dbhandler: DBhandler
let index: Int
var body: some View {
VStack{
Text(dbhandler.arrays.array[index]) <--- here's the index out of range error
Button(action: {
dbhandler.arrays.array.remove(at: index)
}, label: {
Text("Remove object")
})
}
}
}
我的假设是 ForEach 不是指最新的 dbhandler.arrays.array.indices 而是指旧的存储的,但我不知道如何绕过它。
你们中有人知道我该如何解决这个问题吗?
非常感谢任何帮助:)
您可以通过在 SubView index < dbhandler.arrays.array.count 中添加一个检查来修复崩溃,如果索引超出范围,它将不会呈现视图
struct SubView : View {
@EnvironmentObject var dbhandler: DBhandler
let index: Int
var body: some View {
VStack{
if index < dbhandler.arrays.array.count{
Text(dbhandler.arrays.array[index]) //<--- here's the index out of range error
Button(action: {
dbhandler.arrays.array.remove(at: index)
}, label: {
Text("Remove object")
})
}
}
}
}
对于有同样问题的人。我已经找到了实现它的方法。由于 ForEach
存储原始数组并且未引用原始数组,因此可能的解决方法是强制 ForEach
更新自身。你可以这样做:
struct ContentView: View {
@EnvironmentObject var dbhandler: DBhandler
@State var dummyVar : Int = 0
var body: some View {
VStack{
ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
SubView(index: index, dummyVar : dummyVar)
}.id(dummyVar)
}
}
}
在 SubView 中,您只需将 dummyVar 增加 1。