【发布时间】:2020-03-27 01:56:23
【问题描述】:
我正在尝试制作一个示例项目,用于在 swiftUI 列表中添加、选择和删除文件名。这是针对 MacOS 的,因为有一些针对 IOS 的示例,并且存在许多差异。如图所示,我已经设法从其他来源拼凑了一个部分工作示例,但是仍然缺少很多部分。当前示例将允许从查找器中拖动的多个项目添加到列表中,然后四处移动,但缺少以下内容:
通过拖放从查找器添加时选择项目
通过鼠标单击选择单个/多个项目
在添加项目之前根据某些条件过滤掉项目
通过选择删除项目然后按删除
很高兴拥有:
将项目保存和恢复为书签
此外,当前示例只能在数组中已经存在虚拟项的情况下添加新项。以空数组开头可防止任何插入。
我们将不胜感激任何有关这些方面的帮助。谢谢!
struct Item: Identifiable {
let id = UUID()
let title: String
}
struct ContentView: View {
@State private var items : [Item] = (0..<1).map { Item(title: "Item #\($0)") }
@State var selection = Int?.none
var body: some View {
List(selection: $selection){
ForEach(items) { item in
Text(item.title).frame(maxWidth: .infinity, alignment: .leading)
}.onDelete(perform: onDelete)
.onMove(perform: onMove)
.onInsert(of: [String(kUTTypeFileURL)], perform: onInsert)
}
}
private func onDelete(offsets: IndexSet) {
items.remove(atOffsets: offsets)
}
private func onMove(source: IndexSet, destination: Int) {
items.move(fromOffsets: source, toOffset: destination)
}
private func onInsert(at offset: Int, itemProvider: [NSItemProvider]) {
for provider in itemProvider {
provider.loadItem(forTypeIdentifier: (kUTTypeFileURL as String), options: nil) {item, error in
guard let data = item as? Data, let url = URL(dataRepresentation: data, relativeTo: nil) else { return }
DispatchQueue.main.async {
self.items.insert(Item(title: url.path), at: offset)
// let bookMarkData = try url.bookmarkData(options: .securityScopeAllowOnlyReadAccess, includingResourceValuesForKeys: nil, relativeTo: nil)
}
}
}
}
}
【问题讨论】:
标签: macos swiftui swiftui-list