Swift 4+:使用 NSPasteboard 将字符串复制到剪贴板时出现问题

Swift 4+: Issues copying a String to Clipboard using NSPasteboard

我在 Swift 3 和更早的版本中使用了所有这些,但是在 Swift 4 中,无论我使用什么变体,此代码都会将文本输出为 URL。如果我输入 "This is my sample text",粘贴剪贴板后的输出将为 "This%20is%20my%20sample%20text"。我已经尝试过 KuTTypeFileURL 但这似乎也没有任何区别。我在这里错过了什么?我看过有关 Apple 如何改变 Pboard 和其他沙盒问题的帖子和讨论,但我似乎根本无法弄清楚。

在 swift 3 和更早版本

中工作的原始代码
private func copyToClipBoard(textToCopy: String) {
    let pasteBoard = NSPasteboard.general()
    pasteBoard.clearContents()
    pasteBoard.setString(textToCopy, forType: NSStringPboardType)

}

这给出了一个错误 'NSStringPboardType' 在 Swift 中不可用:使用 'PasteboardType.string'

在线搜索后,我发现了描述相同问题的这些帖子,解决方法是将 kuTTypeUrl 用作 String

在此处找到 Whosebug。com/questions/44537356/... 在此处 forums.developer.apple。com/thread/79144

当我以这种方式尝试时,当我只需要一个字符串时,它只是输出为 URL。

@IBOutlet weak var nameTextField: NSTextField!

@IBAction func nameCopy(_ sender: Any) {
    copyToClipBoard(textToCopy: nameTextField.stringValue)
}


let NSStringPboardType = NSPasteboard.PasteboardType(kUTTypeURL as String)

private func copyToClipBoard(textToCopy: String) {
    let pasteBoard = NSPasteboard.general
    pasteBoard.clearContents()
    pasteBoard.setString(textToCopy, forType: NSStringPboardType)
}

您正在粘贴 URL,因为您创建了 PasteboardType kUTTypeURL

解决方法就简单多了,有预定义的string类型

private func copyToClipBoard(textToCopy: String) {
    let pasteBoard = NSPasteboard.general
    pasteBoard.clearContents()
    pasteBoard.setString(textToCopy, forType: .string)

}

documentation

中的备注

Apps that adopt App Sandbox cannot access files identified using the string pasteboard type. Instead, use an NSURL object, a bookmark, or a filename pasteboard type.

文件(也称为字符串路径)相关,与常规字符串无关

我刚刚 运行 遇到了类似的问题。我的代码如下所示:

NSPasteboard.general.setString("Hello World", forType: .string)

不幸的是,这没有用。但我认为有一个错误,如果你不将 NSPasteboard.general 存储到变量中,作为 general 计算的一部分创建的对象 属性 在 [=15= 之前被取消初始化] 更改传播到系统。

因此,如果您像我一样尝试在一行中执行此操作,只需将其分成两行,这对我有用:

let pasteboard = NSPasteboard.general
pasteboard.setString("Hello World", forType: .string)

我通过反馈助手向 Apple (FB9988062) 报告了这个错误。

更新: Apple 回答了我的错误报告,指出您需要在设置值之前调用 declareTypes,如下所示:

NSPasteboard.general.declareTypes([.string], owner: nil)