在带有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
}