如何在 TabView 中使用 PageTabViewStyle 修饰符在首次索引处向集合插入新元素时更新 SwiftUI 的 ForEach



在带有PageTabViewStyle修饰符的TabView中使用ForEach时,这是一个非常具体的问题。

每次我在数组的开头插入元素时,我的应用程序都会崩溃。

我得到

尝试从更新前仅包含11个项目的部分0中删除项目11

错误。

在画布上,它也崩溃了。

结尾的常规追加很好,当我删除PageTabViewStyle修饰符时,它也很好。

如果我需要详细说明或有问题,请告诉我。

更新:我在iOS 15中似乎已经修复了这个问题,我的代码也能正常工作。我仍然希望找到一个iOS 14的变通方法。

我用一个简单的一页应用程序重现了这个问题:

import SwiftUI
struct SwiftUIView: View {
@State var myArray: [String] = ["C", "D", "E", "F", "G"]
var body: some View {
VStack {
Button("Insert before", action: {
myArray.insert("A", at: 0)
})
TabView {
ForEach(myArray, id: .self) { value in
Text("(value)")
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
}

这里是Xcode 12.5/iOS 14.5的测试解决方案。

TabView {
ForEach(myArray, id: .self) { value in
Text("(value)")
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.id(myArray.count)      // << here !!

在ios 14.4或更低版本的PageTabViewStyle中出现了同样的TabView崩溃问题。它崩溃了,因为我的列表最初是空的,而我正在onAppear中填充列表。只是更改了它以检查列表是否为空。

if myArray.count > 0{
TabView {
ForEach(myArray, id: .self) { value in
Text("(value)")
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.id(myArray.count)      //necessary if array size is changing
}

最新更新