SwiftUI:使用Section重新排序使应用崩溃

时间:2020-10-13 22:48:50

标签: swiftui

目标:多个文本视图在视觉上很像Section {}提供的那样分开,同时还能够在编辑模式下重新排列列表中的项目。 (我并没有100%只使用section设置,但是我还没有找到一种在视觉上与Form或List区别的方法。)

问题:使用Section {}时,应用在重新排列时崩溃。

错误消息:'无效的更新:第2节中的行数无效。更新(1)之后,现有节中包含的行数必须等于更新前的那个部分(0),加上或减去从该部分中插入或删除的行数(插入的0,删除0)和加上或减去移入或移出该部分的行数(0移动,0)搬出)。

代码:

struct SingleItem: Identifiable {
    let id = UUID()
    let item: String
}

class ItemGroup: ObservableObject{
    @Published var group = [SingleItem]()
}

struct ContentView: View {
    @ObservedObject var items = ItemGroup()
    @State private var editMode = EditMode.inactive
    
    var body: some View {
        NavigationView{
            Form {
                Button("Add Item"){
                    addButton()
                }
                ForEach(Array(items.group.enumerated()), id: \.element.id) { index, item in
                    Section{
                        Text(items.group[index].item)
                    }
                }
                .onMove(perform: onMove)
            }
            .navigationBarTitle("List")
            .navigationBarItems(trailing: EditButton())
            .environment(\.editMode, $editMode)
            
        }
    }

    func addButton() {
        let newItem = SingleItem(item: "Word - \(items.group.count)")
        self.items.group.append(newItem)
        
    }

    
    private func onMove(source: IndexSet, destination: Int) {
        items.group.move(fromOffsets: source, toOffset: destination)
    }
}

1 个答案:

答案 0 :(得分:0)

改为使用.indices。经过测试,在Xcode 12 / iOS 14上没有崩溃。

    Form {
        ForEach(items.indices, id: \.self) { i in
            Section {
                Text(items[i].title)
            }
        }
        .onMove(perform: onMove)
    }