Как работает перетаскивание в swiftui на iOS 14? - PullRequest
1 голос
/ 02 августа 2020

Я экспериментирую с перетаскиванием, чтобы позже включить его в свое приложение.

Я предлагаю рабочее решение, которое позволяет перетаскивать элемент из VStack, и оно отлично работает на iOS 13.5 .

К сожалению, тот же код не работает в симуляторе iOS 14.0 (Xcode 12 beta 3).

iOS 13.5: при выпадении элемента сначала вызывается loadData, а затем вызывается объект, и поставщики в onDrop содержат элемент

iOS 14.0: при удалении элемента функции не вызываются, а поставщики в onDrop пусты

Я не могу понять, iOS 14.0 требует дополнительного кода или это проблема iOS 14.

Есть идеи?


struct ContentView: View {
    @ObservedObject var model = Model()
    var body: some View {
        HStack {
            Spacer()
            VStack {
                ForEach(model.items, id: \.name) { item in
                    ItemView(item: item)
                }
            }
            Spacer()
            DropView().environmentObject(model)
        }
    }
}
struct ItemView: View {
    var item: Item
    var body: some View {
        Text(item.name)
            .onDrag({
                    NSItemProvider(object: self.item)
                })
    }
}
struct DropView: View {
    @EnvironmentObject var model: Model
    var body: some View {
        Text("Drop Here")
            .onDrop(of: [Item.typeIdentifier], isTargeted: nil) { providers, position in
                print("providers \(providers) position \(position)")
                guard let provider = providers.first(where: { provider in provider.hasItemConformingToTypeIdentifier(Item.typeIdentifier) })
                else {
                    return false
                }
                provider.loadObject(ofClass: Item.self) { reading, _ in
                    guard let item = reading as? Item else {
                        return
                    }
                    DispatchQueue.main.async {
                        self.model.items.removeAll(where: { a in a.name == item.name })
                    }
                }
                return true
            }
    }
}
class Model: ObservableObject {
    @Published var items = [
        Item(name: "Item 1"),
        Item(name: "Item 2"),
        Item(name: "Item 3"),
        Item(name: "Item 4"),
    ]
}
class Item: NSObject {
    public static let typeIdentifier = "dnd.item"
    var name: String
    init(name: String) {
        self.name = name
        super.init()
    }
}

...