Добавление, выбор и удаление имен файлов в список swiftUI - MacOS - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать пример проекта для добавления, выбора и удаления имен файлов в список swiftUI. Это для MacOS, так как есть несколько примеров для IOS, и есть ряд отличий. Мне удалось собрать воедино частичный рабочий пример из других источников, как показано, но есть еще несколько частей, которые все еще отсутствуют. В текущем примере разрешено добавлять в список несколько элементов, перетаскиваемых из искателя, а затем перемещать их, но при этом отсутствует следующее:

Выбор элементов при добавлении из искателя с помощью перетаскивания
Выбор одного / несколько элементов с помощью щелчка мыши
Отфильтровать элементы по некоторым критериям перед их добавлением
Удаление элементов с помощью выбора, затем нажмите delete

Приятно иметь:
Сохранение и восстановление элементов в виде закладки

Кроме того, текущий пример может добавлять новые элементы, только если в массиве уже есть фиктивный элемент. Начало с пустого массива предотвращает любые вставки.

Любая помощь с любым из них будет высоко ценится. Спасибо!

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)
                }
            }
        }
    }
}
...