2b85305990c3fa8e645d3db7a14edfec
SwiftUI 拖拽商品到购物车组件 NSItemProvider(教程含源码)

实战需求

SwiftUI 拖拽商品到购物车组件

本文价值与收获

看完本文后,您将能够作出下面的界面

截屏2020-10-31 上午11.49.35.png

截屏2020-10-31 上午11.49.35.png

Jietu20201031-115007.gif

Jietu20201031-115007.gif

看完本文您将掌握的技能

  • NSItemProvider
  • onInsert
  • overlay

基础知识

NSItemProvider

一个项目提供程序,用于在拖放或复制/粘贴活动期间或从主机应用程序到应用程序扩展程序之间在流程之间传送数据或文件。

class NSItemProvider : NSObject

总览

从iOS 11开始,项目提供者在拖放以及复制/粘贴中起着核心作用。他们继续在应用扩展中发挥作用。

系统在内部队列上调用该类中使用的所有完成块。通过拖放使用项目提供程序时,请确保在主队列上进行用户界面更新,如下所示:NSItemProvider

DispatchQueue.main.async {
    // work that impacts the user interface
}

应用扩展支持

当检查对象的attachments属性时,应用程序扩展通常会遇到项目提供程序。在检查过程中,扩展程序可以使用该方法来查找它可以识别的数据。项目提供者使用统一类型标识符(UTI)值来标识它们包含的数据。找到扩展可以使用的数据类型后,它将调用该方法以加载实际数据,该方法将传递给提供的完成处理程序。NSExtensionItemhasItemConformingToTypeIdentifier(_:)loadItem(forTypeIdentifier:options:completionHandler:)

您可以创建项目提供者以将数据出售给另一个流程。修改原始数据项的扩展可以创建一个新的NSItemProvider对象,以发送回主机应用程序。创建数据项时,您可以指定数据对象和该对象的类型。您可以选择使用该属性为数据生成预览图像。previewImageHandler

单个项目提供者可以使用自定义块以许多不同格式提供其数据。配置项目提供者时,请使用该方法注册您的块以及每个块支持的格式。当客户请求特定格式的数据时,项目提供者将执行相应的块,然后该块负责将数据强制为适当的类型并将其返回给客户。registerItem(forTypeIdentifier:loadHandler:)


实战代码

```
import SwiftUI

struct ContentView: View {
let string = "苹果🍎"
let string1 = "香蕉🍌"
let string2 = "猕猴桃🥝"

@State private var items: [String] = []

// border with highlight added just for better visibility
@State private var dragOver = false
top Created with Sketch.