You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:48:03