I'm a beginner with Swift, and I'm trying to figure out how can I read what has been copied to the clipboard On macOS (Swift 3)? I've searched a lot but can't seem to find anything that works.
A few of the things I've tried from online:
var pasteboardItems: [NSPasteboardItem]? { get }
print("\(pasteboardItems)")
and
let pb = NSPasteboard.general()
pb.string(forType: NSPasteboardTypeString)
print("\(pb)")
and
let pasteboard = UIPasteboard.general
if let string = pasteboard.string {
// text was found and placed in the "string" constant
}
and lastly
func paste(sender: AnyObject?) {
let pasteboard = NSPasteboard.generalPasteboard()
if let nofElements = pasteboard.pasteboardItems?.count {
if nofElements > 0 {
// Assume they are strings
var strArr: Array<String> = []
for element in pasteboard.pasteboardItems! {
if let str = element.stringForType("public.utf8-plain-text") {
strArr.append(str)
}
}
// Exit if no string was read
if strArr.count == 0 { return }
// Perform the paste operation
dataSource.cmdPaste(strArr)
}
}
}
Works for Swift 3 and Swift 4
// Set string to clipboard
let pasteboard = NSPasteboard.general
pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
pasteboard.setString("Good Morning", forType: NSPasteboard.PasteboardType.string)
var clipboardItems: [String] = []
for element in pasteboard.pasteboardItems! {
if let str = element.string(forType: NSPasteboard.PasteboardType(rawValue: "public.utf8-plain-text")) {
clipboardItems.append(str)
}
}
// Access the item in the clipboard
let firstClipboardItem = clipboardItems[0] // Good Morning
Times have changed. In Swift 3+ you would do it like this: (if you are only interested in strings)
func clipboardContent() -> String?
{
return NSPasteboard.general.pasteboardItems?.first?.string(forType: .string)
}
Another Swift 4 Solution
// Write to pasteboard
let pasteboard = NSPasteboard.general
pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
pasteboard.setString("Good Morning", forType: NSPasteboard.PasteboardType.string)
// Read from pasteboard
let read = pasteboard.pasteboardItems?.first?.string(forType: .string)
Another solution.
class ViewController : NSViewController {
@IBAction func pasteMenuItemAction(_ sender: NSMenuItem) {
let p = NSPasteboard.general
let x = p.readObjects(forClasses: [NSString.self], options: nil)
let s = x as! [NSString]
if 0 < s.count {
print(s[0])
}
}
}
That func pasteMenuItemAction()
is bound to an Edit > Paste menu item.
I use writeObjects()
for Edit > Copy. So it is natural for me to use its counterpart readObjects()
here.
Confirmed with Xcode 9.2, Swift 4
Added:
One of the solutions for Edit > Copy:
@IBAction func copyMenuItemAction(_ sender: NSMenuItem) {
let t = "Hello!"
let p = NSPasteboard.general
p.clearContents()
p.writeObjects([t as NSPasteboardWriting])
}
That func copyMenuItemAction()
is bound to an Edit > Copy menu item.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With