SwiftUI Drag and Drop файлы - PullRequest
       0

SwiftUI Drag and Drop файлы

1 голос
/ 24 марта 2020

Я пытаюсь добавить жест / функцию «Перетаскивание» в мое приложение SwiftUI Ma c.

Я хочу добавить файлы из моей системы / рабочего стола в мое приложение. Это возможно в обычном Swift, который я нашел. Я пытаюсь сделать это в SwiftUI сейчас.

Я нахожу функцию onDrop() в SwiftUI для представлений. Тем не менее, похоже, что это только для внутренних жестов внутри моего приложения. Я хочу перетаскивать файлы извне.

В Swift вам необходимо зарегистрировать NSView для перетаскиваемых типов.

registerForDraggedTypes([kUTTypeFileURL,kUTTypeImage])

Я подумал о создании NSViewRepresentable и поместил его в мое представление SwiftUI.

Это код, который я придумал, однако я не могу назвать registerForDraggedTyped.

final class DragDropView: NSViewRepresentable {

    func makeNSView(context: NSViewRepresentableContext<DragDropView>) -> NSView {
        let view = NSView()

        view.registerForDraggedTypes([NSPasteboard.PasteboardType.pdf, NSPasteboard.PasteboardType.png])

        return view
    }

    func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext<DragDropView>) {

    }

Есть ли более простое решение для этого в SwiftUI? Я хотел бы использовать эту функцию onDrop (), но это не работает для внешних файлов, не так ли?

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Вот демонстрация перетаскивания, протестированная с Xcode 11.4 / macOS 10.15.4.

Начальный image находится в библиотеке ресурсов, принимает перетаскивание (только для простоты) в качестве URL файла из Finder / Desktop (перетаскивание) и в TextEdit (перетаскивание), регистрирует перетаскивание для представления в формате TIFF.

struct TestImageDragDrop: View {
    @State var image = NSImage(named: "image")
    @State private var dragOver = false

    var body: some View {
        Image(nsImage: image ?? NSImage())
            .onDrop(of: ["public.file-url"], isTargeted: $dragOver) { providers -> Bool in
                providers.first?.loadDataRepresentation(forTypeIdentifier: "public.file-url", completionHandler: { (data, error) in
                    if let data = data, let path = NSString(data: data, encoding: 4), let url = URL(string: path as String) {
                        let image = NSImage(contentsOf: url)
                        DispatchQueue.main.async {
                            self.image = image
                        }
                    }
                })
                return true
            }
            .onDrag {
                let data = self.image?.tiffRepresentation
                let provider = NSItemProvider(item: data as NSSecureCoding?, typeIdentifier: kUTTypeTIFF as String)
                provider.previewImageHandler = { (handler, _, _) -> Void in
                    handler?(data as NSSecureCoding?, nil)
                }
                return provider
            }
            .border(dragOver ? Color.red : Color.clear)
    }
}
0 голосов
/ 24 марта 2020

Не можете ли вы использовать onDrop (из: isTargeted: execute:) ? Вы можете передать свой массив поддерживаемых типов в аргументе of.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...