目标:多个文本视图在视觉上很像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)
}
}
答案 0 :(得分:0)
改为使用.indices
。经过测试,在Xcode 12 / iOS 14上没有崩溃。
Form {
ForEach(items.indices, id: \.self) { i in
Section {
Text(items[i].title)
}
}
.onMove(perform: onMove)
}