我正在尝试使用自定义类型标识符在 macOS 上实现拖放以避免冲突,但它似乎不起作用。首先,这是一个具有公共(public)和已知标识符的工作示例:
struct ReleaseView: View {
let id: Int
var body: some View {
GeometryReader { _ in
VStack(spacing: 16) {
Image(nsImage: NSImage(named: NSImage.networkName)!)
.contentShape(Rectangle())
.onDrag {
return NSItemProvider(item: "\(self.id)" as NSString, typeIdentifier: NSPasteboard.PasteboardType.string.rawValue)
}
DropZone()
}
}
}
}
struct DropZone: View {
@State var isDragging = false
var body: some View {
RoundedRectangle(cornerRadius: 16)
.stroke(style: StrokeStyle(lineWidth: 4, dash: [8, 8]))
.background(isDragging ? Color.secondary : Color.clear)
.frame(width: 100, height: 100)
.onDrop(of: [NSPasteboard.PasteboardType.string.rawValue], isTargeted: self.$isDragging) { itemProvider in
print(itemProvider)
return true
}
}
}
在此示例中,您可以将上面的图像拖到放置区域中,它将打印出提供程序。现在,只需更改
typeIdentifier
打破一切。static let sharedTypeIdentifier = "com.procrastin8.plzwork"
struct ReleaseView: View {
// skipping the unchanged bits
.onDrag {
return NSItemProvider(item: "\(self.id)" as NSString, typeIdentifier: sharedTypeIdentifier)
}
}
struct DropZone: View {
// skipping the unchanged bits
.onDrop(of: [sharedTypeIdentifier], isTargeted: self.$isDragging) { itemProvider in
print(itemProvider)
return true
}
}
现在这行不通了。在这里使用相同的常量,所以它不是字符串不匹配。又一个 SwiftUI 错误?
最佳答案
typeIdentifier
上面的不仅仅是一个唯一的字符串,它必须是 UTI .
如果你想使用一些自定义应用程序特定的 UTI(如果你真的需要它,请三思而后行),那么你必须根据 Apple 规则注册一个,从
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.procrastin8.plzwork</string>
...
在应用程序 Info.plist
具体参见 Declaring New Uniform Type Identifiers 中的详细信息并广泛收藏 Technical Q&A QA1796
backup
关于macos - 使用自定义类型标识符拖放不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225141/