在 swiftUI 列表中添加、选择和删除文件名 - MacOS

Posted

技术标签:

【中文标题】在 swiftUI 列表中添加、选择和删除文件名 - MacOS【英文标题】:Adding, Selecting and Deleting file names to a swiftUI list - MacOS 【发布时间】: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)
                
            
        
    

【问题讨论】:

【参考方案1】:

添加时选择项目非常简单,您只需在self.items.insert(Item(title: url.path), at: offset) 之后的onInsert 中插入一行代码,然后将其从dispatchQueue 中删除。并添加self.selection = offset

【讨论】:

以上是关于在 swiftUI 列表中添加、选择和删除文件名 - MacOS的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中删除列表选择指示器和分隔符?

在 macOS 上的 SwiftUI 列表视图中选择和删除核心数据实体

如何从 SwiftUI 和 Realm 中另一个列表中的对象中添加和删除列表中的对象

SwiftUI:无法删除列表中的行

浅谈CoreData海量数据(实时动态添加和删除)在SwiftUI列表中分页显示的原理及实现

在 SwiftUI 中的列表上实现删除功能