![](/img/trans.png)
[英]SwiftUI NavigationLink @Binding of an array element causes Fatal error: Index out of range
[英]SwiftUI - Fatal error: index out of range on deleting element from an array
我在應用存儲上有一個數組。 我正在使用 foreach 方法顯示其元素。 它可以在數組的每個元素上滑動刪除。 但是當我刪除一個時,應用程序崩潰了。 這是我的第一個觀點;
struct View1: View {
@Binding var storedElements: [myElements]
var body: some View{
GeometryReader {
geometry in
VStack{
ForEach(storedElements.indices, id: \.self){i in
View2(storedElements: $storedElements[i], pic: $storedWElements[i].pic, allElements: $storedElements, index: i)
}
}.frame(width: geometry.size.width, height: geometry.size.height / 2, alignment: .top).padding(.top, 25)
}
}
}
和視圖2;
struct View2: View {
@Binding var storedElements: myElements
@Binding var pic: String
@Binding var allElements: [myElements]
var index: Int
@State var offset: CGFloat = 0.0
@State var isSwiped: Bool = false
@AppStorage("pics", store: UserDefaults(suiteName: "group.com.some.id"))
var arrayData: Data = Data()
var body : some View {
ZStack{
Color.red
HStack{
Spacer()
Button(action: {
withAnimation(.easeIn){
delete()}}) {
Image(systemName: "trash").font(.title).foregroundColor(.white).frame(width: 90, height: 50)
}
}
View3(storedElements: $storedElements).background(Color.red).contentShape(Rectangle()).offset(x: self.offset).gesture(DragGesture().onChanged(onChanged(value:)).onEnded(onEnd(value:)))
}.frame(width: 300, height: 175).cornerRadius(30)
}
}
func onChanged(value: DragGesture.Value) {
if value.translation.width < 0 {
if self.isSwiped {
self.offset = value.translation.width - 90
}else {
self.offset = value.translation.width
}
}
}
func onEnd(value: DragGesture.Value) {
withAnimation(.easeOut) {
if value.translation.width < 0 {
if -value.translation.width > UIScreen.main.bounds.width / 2 {
self.offset = -100
delete()
}else if -self.offset > 50 {
self.isSwiped = true
self.offset = -90
}else {
self.isSwiped = false
self.offset = 0
}
}else {
self.isSwiped = false
self.offset = 0
}
}
}
func delete() {
//self.allElements.remove(at: self.index)
if let index = self.allElements.firstIndex(of: storedElements) {
self.allElements.remove(at: index)
}
}
}
OnChange 和 onEnd 函數用於滑動。 我認為它是導致崩潰的 foreach 方法。 還嘗試了刪除 function 的注釋行,但沒有幫助。 而且我知道它是一個很長的問題代碼。 我嘗試了幾天並在這里嘗試了所有答案,但沒有一個能解決我的問題。
在您的 myElements 類/結構中,確保它具有唯一的屬性。 如果沒有添加一個並在初始化時設置一個唯一的 ID
public class myElements {
var uuid: String
init() {
self.uuid = NSUUID().uuidString
}
}
然后在刪除元素時,而不是
if let index = self.allElements.firstIndex(of: storedElements) {
self.allElements.remove(at: index)
}
利用
self.allElements.removeAll(where: { a in a.uuid == storedElements.uuid })
這是數組綁定安全的,因為它不使用索引
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.