swiftclipboardnspasteboardpasteboard

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


I had this all working in Swift 3 and earlier but with Swift 4 no matter what variation I use this code will instead output text as a URL. If I put in "This is my sample text" the output after pasting the clipboard will be "This%20is%20my%20sample%20text". I have tried KuTTypeFileURL but that doesn't appear to make any difference either. What am I missing here? I have seen posts and discussions about how Apple is changing Pboards and other issues with sandboxing but I can't seem to figure this out at all.

original code what was working in swift 3 and earlier

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

}

This gives an error of 'NSStringPboardType' is unavailable in Swift: use 'PasteboardType.string'

After searching online I came across these posts that describe the same issue and the workaround was to use the kuTTypeUrl as String

Found here stackoverflow.com/questions/44537356/… and here forums.developer.apple.com/thread/79144

When I try it this way it simply outputs as a URL when I just need a String.

@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)
}

Solution

  • You are pasting an URL because you created a PasteboardType kUTTypeURL.

    The solution is much simpler, there is a predefined string type

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

    The note in the 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.

    is related to files (aka string paths), not to regular strings