Swift 4: Проблемы с копированием строки в буфер обмена с помощью NSPasteboard

У меня все это работало в Swift 3 и более ранних версиях, но в Swift 4 независимо от того, какой вариант я использую, этот код вместо этого будет выводить текст в виде URL. Если я добавлю "Это мой образец текста", то после вставки буфера обмена будет выводиться "Этот%20is%20my%20sample%20text". Я пробовал KuTTypeFileURL, но это тоже не имеет значения. Что мне здесь не хватает? Я видел сообщения и дискуссии о том, как Apple меняет Pboards, и другие вопросы, связанные с песочницей, но, похоже, я вообще не могу этого понять.

оригинальный код, который работал в Swift 3 и ранее

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

}

Это дает ошибку "NSStringPboardType" недоступно в Swift: используйте "PasteboardType.string"

После поиска в Интернете я наткнулся на эти сообщения, описывающие ту же проблему, и обходной путь должен был использовать kuTTypeUrl в качестве String

Нашел здесь stackru.com/questions/44537356/… и здесь форумы.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)
}

2 ответа

Решение

Вы вставляете URL, потому что вы создали PasteboardType URL KUTType.

Решение гораздо проще, есть предопределенный string тип

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

}

Примечание в документации

Приложения, использующие App Sandbox, не могут получить доступ к файлам, идентифицированным с использованием типа строки ввода Вместо этого используйте объект NSURL, закладку или тип монтажного стола с именем файла.

относится к файлам (или к строковым путям), а не к обычным строкам

Я только что столкнулся с похожей проблемой. Мой код выглядел так:

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

К сожалению, это не сработало. Но я подумал, что есть ошибка, из-за которой, если вы не сохраните NSPasteboard.generalв переменную, объект, созданный как часть generalвычисляемое свойство деинициализируется до того, как setStringизменение распространяется на систему.

Поэтому, если вы пытались сделать это в одной строке, как я, просто разделите ее на две, что сработало для меня:

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

Я сообщил об этой ошибке через помощника обратной связи в Apple (FB9988062).

ОБНОВЛЕНИЕ:Apple ответила на мой отчет об ошибке, заявив, что вам нужно позвонитьdeclareTypesперед установкой значения, например:

      NSPasteboard.general.declareTypes([.string], owner: nil)
Другие вопросы по тегам