我可以在两个列表中切换行,而不仅仅是在 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)
}
}
}
}
}
如果我想通过拖放来切换行,我应该使用什么?
这是我的代码。
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)
}
}
}
}
}