Чтение из буфера обмена с помощью Swift 3 на macOS

Я новичок в Swift и пытаюсь понять, как я могу прочитать то, что было скопировано в буфер обмена в macOS (Swift 3)? Я много искал, но не могу найти ничего, что работает.

Несколько вещей, которые я пробовал в Интернете:

var pasteboardItems: [NSPasteboardItem]? { get }
print("\(pasteboardItems)")

а также

let pb = NSPasteboard.general()
pb.string(forType: NSPasteboardTypeString)

print("\(pb)")

а также

let pasteboard = UIPasteboard.general
if let string = pasteboard.string {
    // text was found and placed in the "string" constant
}

И наконец

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

person John    schedule 03.01.2017    source источник
comment
Ваш второй код - единственная попытка в правильном направлении. 3-й для iOS. 4-й это Swift 2. 1-й смысла нет.   -  person rmaddy    schedule 04.01.2017


Ответы (5)


Работает для Swift 3 и 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
person ronatory    schedule 03.01.2017
comment
Да, рад, что смог тебе помочь! - person ronatory; 04.01.2017
comment
clipboardItems для меня пусто. - person Jithin Pavithran; 23.02.2020

Времена изменились. В Swift 3+ вы бы сделали это так: (если вас интересуют только строки)

func clipboardContent() -> String?
{
    return NSPasteboard.general.pasteboardItems?.first?.string(forType: .string)
}
person LimeRed    schedule 26.08.2017

Еще одно решение для Swift 4

// 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)
person Koray Birand    schedule 23.09.2018

Другое решение.

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

}

Эта функция pasteMenuItemAction() привязана к пункту меню «Правка» > «Вставить».

Я использую writeObjects() для Правка > Копировать. Поэтому для меня естественно использовать здесь его аналог readObjects().

Подтверждено Xcode 9.2, Swift 4

Добавлено:

Одно из решений для Правка > Копировать:

  @IBAction func copyMenuItemAction(_ sender: NSMenuItem) {
    let t = "Hello!"
    let p = NSPasteboard.general
    p.clearContents()
    p.writeObjects([t as NSPasteboardWriting])
  }

Эта функция copyMenuItemAction() привязана к пункту меню Правка > Копировать.

person Tora    schedule 14.04.2018

Проще ✅ Swift 4:

@IBAction func pasteAction(_ sender: Any) {
    guard let stringToPaste: String = UIPasteboard.general.items.last?.first?.value as? String else { return }
    MYTEXTVIEW.text = stringToPaste
}
person Joshua Hart    schedule 27.08.2018