onDrag 是 SwiftUI 中用于实现拖拽(Drag and Drop)功能的修饰符,它允许将某个视图变成“可以拖拽的内容源”。
View.onDrag(_ data: @escaping () -> NSItemProvider?)
它表示:当用户在这个视图上长按并开始拖拽时,提供一个 NSItemProvider,用于系统识别拖动的内容类型(如图像、文字、文件等)。
示例:拖拽图片
Image(nsImage: myImage)
.onDrag {
let provider = NSItemProvider(object: myImage)
return provider
}
当这张图片上开始拖动,macOS 会调用 .onDrag 中的闭包,将 myImage 封装为一个 NSItemProvider,系统就能识别这个拖拽操作并允许拖到 Finder、桌面或其他接受拖拽的 App。
适用场景
1、拖出图像:NSImage、UIImage;
2、拖出文件路径:URL(fileURLWithPath:);
3、拖出文本内容:NSString、String;
4、拖出 PDF:NSData 或 NSFileWrapper;
5、拖出多种类型:NSItemProvider 支持多类型加载方式。
使用示例
1、拖出字符串
Text("拖我一下")
.onDrag {
NSItemProvider(object: "Hello World" as NSString)
}
2、拖出图片
Image(nsImage: image)
.onDrag {
NSItemProvider(object: image)
}
注意事项
.onDrag 只能用在 macOS / iPadOS / 支持拖拽的视图上。
NSItemProvider 是 UIKit/AppKit 层的 API,SwiftUI 只是桥接它。
拖动图片、文件或文字都要依赖 NSItemProvider 包装内容。
相关文章
Apple NSItemProvider类:https://fangjunyu.com/2025/07/09/apple-nsitemprovider%e7%b1%bb/