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)
}
中的备注
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)
我在 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)
}
中的备注
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)