gpt4 book ai didi

ios - 在 SwiftUI 中将项目从一个列表拖动到另一个列表

转载 作者:行者123 更新时间:2023-12-02 01:51:31 26 4
gpt4 key购买 nike

我有两个列表,每个列表都有简单的项目。我可以使用下面所示的代码重新排列列表中的项目。我希望能够从一个列表中拖动一个项目并将其放入另一个列表中。不确定我需要启用什么才能实现这一点。现在,我可以将某个列表中的某些内容拖到整个屏幕上,但我无法将其放在其自己的列表之外的任何位置;如果我在其他地方释放拖动力,它就会飞回原来的位置。

显然,我需要添加一些东西来实现所需的行为;任何关于所需内容的想法(不一定使用 .onMove ——在同一个列表中)将不胜感激。

struct ContentView: View {
@State private var users1 = ["AAA", "BBB", "CCC"]
@State private var users2 = ["DDD", "EEE", "FFF"]
@State private var isEditable = true

var body: some View {
HStack {
Spacer()
List {
ForEach(users1, id: \.self) { user in
Text(user)
.background(Color(.yellow))
}
.onMove(perform: move1)
}
.environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive))
Spacer()
List {
ForEach(users2, id: \.self) { user in
Text(user)
.background(Color(.orange))
}
.onMove(perform: move2)
}
.environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive))
Spacer()
}
}
func move1(from source: IndexSet, to destination: Int) {
users1.move(fromOffsets: source, toOffset: destination)
}
func move2(from source: IndexSet, to destination: Int) {
users2.move(fromOffsets: source, toOffset: destination)
}
}

最佳答案

我认为 SwiftUI 还不可能做到这一点。这段代码展示了如何使用两个 UITableView。我希望您能够改进这一点以实现您所寻求的目标。

首先创建这个类来完成所有的魔法。您需要导入 UIKitMobileCoreServices

class TableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITableViewDragDelegate, UITableViewDropDelegate {

var leftTableView = UITableView()
var rightTableView = UITableView()

var removeIndex = IndexPath()

var leftItems: [String] = [
"Hello",
"What",
"is",
"happening"
]
var rightItems: [String] = [
"I",
"don't",
"know"
]

func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let string = tableView == leftTableView ? leftItems[indexPath.row] : rightItems[indexPath.row]
self.removeIndex = indexPath
guard let data = string.data(using: .utf8) else { return [] }
let itemProvider = NSItemProvider(item: data as NSData, typeIdentifier: kUTTypePlainText as String)

return [UIDragItem(itemProvider: itemProvider)]
}

func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
let destinationIndexPath: IndexPath

if let indexPath = coordinator.destinationIndexPath {
destinationIndexPath = indexPath
} else {
let section = tableView.numberOfSections - 1
let row = tableView.numberOfRows(inSection: section)
destinationIndexPath = IndexPath(row: row, section: section)
}

coordinator.session.loadObjects(ofClass: NSString.self) { items in
guard let strings = items as? [String] else {
return
}
var indexPaths = [IndexPath]()
for (index, string) in strings.enumerated() {
let indexPath = IndexPath(row: destinationIndexPath.row + index, section: destinationIndexPath.section)
if tableView == self.leftTableView {
self.leftItems.insert(string, at: indexPath.row)
} else {
self.rightItems.insert(string, at: indexPath.row)
}
indexPaths.append(indexPath)
}
if tableView == self.leftTableView {
self.rightItems.remove(at: self.removeIndex.row)
self.rightTableView.deleteRows(at: [self.removeIndex], with: .automatic)
} else {
self.leftItems.remove(at: self.removeIndex.row)
self.leftTableView.deleteRows(at: [self.removeIndex], with: .automatic)
}
tableView.insertRows(at: indexPaths, with: .automatic)
}
}

override func viewDidLoad() {
super.viewDidLoad()

leftTableView.dataSource = self
rightTableView.dataSource = self

leftTableView.frame = CGRect(x: 0, y: 40, width: 150, height: 400)
rightTableView.frame = CGRect(x: 150, y: 40, width: 150, height: 400)

leftTableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
rightTableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

view.addSubview(leftTableView)
view.addSubview(rightTableView)

leftTableView.dragDelegate = self
leftTableView.dropDelegate = self
rightTableView.dragDelegate = self
rightTableView.dropDelegate = self

leftTableView.dragInteractionEnabled = true
rightTableView.dragInteractionEnabled = true
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == leftTableView {
return leftItems.count
} else {
return rightItems.count
}
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

if tableView == leftTableView {
cell.textLabel?.text = leftItems[indexPath.row]
} else {
cell.textLabel?.text = rightItems[indexPath.row]
}

return cell
}
}

之后你将其包装起来:

struct TableView: UIViewControllerRepresentable {

func makeUIViewController(context: Context) -> TableViewController {
let v = TableViewController()
return v
}

func updateUIViewController(_ viewController: TableViewController, context: Context) {

}

}

最后使用它:

struct ContentView: View {


var body: some View {
VStack {
TableView()
}
}
}

我希望这会有所帮助。

关于ios - 在 SwiftUI 中将项目从一个列表拖动到另一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58492720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com