SwiftUI使用DropDelegate时无法获取拖拽的NSString值如何解决?
问题原因
- 代码存在变量名笔误:你在
performDrop方法中,获取itemProvider后的变量名声明为items,但后续调用loadItem时使用的变量名是item,变量名不匹配会导致加载逻辑无法被执行。 - 类型匹配逻辑错误:使用
public.text类型标识符调用loadItem时,系统默认返回的是Data类型对象,而非你预期的NSString,没有做类型转换自然拿不到正确的文本内容。
修复方案
你可以直接对返回的Data做字符串转换,修复后的完整代码如下:
// 拖拽发起侧代码不变 struct ContentView: View { var body: some View { Text("Hello World") .onDrag { NSItemProvider(object: "Hello World" as NSString) } } } // 拖拽接收侧修复逻辑 struct DroppedView: View, DropDelegate { var body: some View { Text("Drop here") .onDrop(of: ["public.text"], delegate: self) } func performDrop(info: DropInfo) -> Bool { // 修复变量名笔误 if let item = info.itemProviders(for: ["public.text"]).first { item.loadItem(forTypeIdentifier: "public.text", options: nil) { (data, error) in // 将返回的Data转为字符串 if let textData = data as? Data, let text = String(data: textData, encoding: .utf8) { print(text) // 控制台正常输出Hello World } } } return true } }
如果你适配iOS15+/macOS12+,也可以使用更简洁的原生加载NSString的API,需要先导入UniformTypeIdentifiers框架:
import UniformTypeIdentifiers struct ContentView: View { var body: some View { Text("Hello World") .onDrag { NSItemProvider(object: "Hello World" as NSString) } } } struct DroppedView: View, DropDelegate { var body: some View { Text("Drop here") // 用系统定义的UTType更规范,避免手写字符串错误 .onDrop(of: [UTType.text], delegate: self) } func performDrop(info: DropInfo) -> Bool { if let item = info.itemProviders(for: [UTType.text]).first { // 直接指定加载NSString类型 item.loadObject(ofClass: NSString.self) { text, error in if let text = text as? String { print(text) } } } return true } }
内容的提问来源于stack exchange,提问作者iphaaw
相关产品推荐
相关产品推荐

