我可以在两个列表中切换行,而不仅仅是在 SwiftUI 中添加和删除吗?

Can I switch rows in two lists not just add and delete in SwiftUI?

如果我想通过拖放来切换行,我应该使用什么?

这是我的代码。

import SwiftUI
struct ContentView: View {
    @State private var users1 = ["Paul", "Taylor", "Adele"]
    @State private var users2 = ["Pauline", "Tom", "Adam"]

    var body: some View {
        VStack {
            HStack {
                Spacer()
                Text("Users")
                    .font(.headline)
                Spacer()
                EditButton()
                Spacer()
                    .frame(width: 10)
            }
            VStack(spacing: 0) {
                List {
                    Section(header: Text("list 1"), footer: Text("footer"), content: {
                        ForEach(users1, id: \.self) { user in
                            Text(user)
                                .onDrag { NSItemProvider(object: user as NSString) }
                        }
                        .onMove(perform: moveList1)
                        .onInsert(of: ["public.text"], perform: dropList1)
                    })

                }
                .listStyle(GroupedListStyle())
                List {
                    Section(header: Text("list 2"), footer: Text("footer"), content: {
                        ForEach(users2, id: \.self) { user in
                            Text(user)
                                .onDrag { NSItemProvider(object: user as NSString) }
                        }
                        .onMove(perform: moveList2)
                        .onInsert(of: ["public.text"], perform: dropList2)
                    })
                }
                .listStyle(GroupedListStyle())

            }
        }
    }
    func dropList1(at index: Int, _ items: [NSItemProvider]) {
        for item in items {
            _ = item.loadObject(ofClass: String.self) { droppedString, _ in
                if let ss = droppedString {
                    DispatchQueue.main.async {
                        self.users1.insert(ss, at: index)
                        self.users2.removeAll { [=10=] == ss }
                    }
                }
            }
        }
    }
    func dropList2(at index: Int, _ items: [NSItemProvider]) {
        for item in items {
            _ = item.loadObject(ofClass: String.self) { droppedString, _ in
                if let ss = droppedString {
                    DispatchQueue.main.async {
                        self.users2.insert(ss, at: index)
                        self.users1.removeAll { [=10=] == ss }
                    }
                }
            }
        }
    }
    func moveList1(from source: IndexSet, to destination: Int) {
        users1.move(fromOffsets: source, toOffset: destination)
    }
    func moveList2(from source: IndexSet, to destination: Int) {
        users2.move(fromOffsets: source, toOffset: destination)
    }
}

这段代码只是通过拖放添加和删除行。

切换意味着如果我将第 1 组的 Paul 拖放到第 2 组的 Tom 上方,

保罗自动参加派对 2,汤姆自动参加派对 1。

还有一个问题,我可以在没有编辑按钮的情况下编辑行吗?

也许总是编辑模式之类的?

此代码段会将项目从 List1 交换到 List2。同样模仿 dropList1 方法。

func dropList2(at index: Int, _ items: [NSItemProvider]) {
        for item in items {
            _ = item.loadObject(ofClass: String.self) { droppedString, _ in
                if let ss = droppedString, let users1Index = self.users1.firstIndex(where: {[=10=] == ss}) {
                    DispatchQueue.main.async {
                        let users2Item = self.users2.remove(at: index)
                        self.users1.remove(at: users1Index)
                        self.users1.insert(users2Item, at: users1Index)
                        self.users2.insert(ss, at: index)
                    }
                }
            }
        }
    }