macos - 使用自定义类型标识符拖放不起作用

标签 macos swiftui

我正在尝试使用自定义类型标识符在 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/

相关文章:

使用 NavigationLink isActive 时 View 之间的动画不起作用

ruby - 使用 libusb 和 Ruby 从 USB 设备(Waterrower S4 Monitor)读取数据

Mac OS 上的 Android Studio IDE :error=13, 权限被拒绝

javascript - 从 MAC 照片应用程序上传到 PHP 表单

macos - Xcode 4 实时协同编辑

ios - 如何将渐变应用于任何 View 的 accentColor - SwiftUI

C++:32 位到 64 位迁移

ios - 在 SwiftUI 中填写父项

ios - 尝试在 60 秒后触发警报框。这是行不通的

swiftui - 有没有办法在 SwiftUI 列表中隐藏滚动指示器?