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)