代码之家  ›  专栏  ›  技术社区  ›  kiddslopp

Swift 4+:使用NSPasteboard将字符串复制到剪贴板

  •  2
  • kiddslopp  · 技术社区  · 6 年前

    我在Swift 3和更早版本中都有这些功能,但在Swift 4中,无论使用何种变体,此代码都会将文本输出为URL。如果我输入“This is my sample text”,粘贴剪贴板后的输出将是“This%20is%20my%20sample%20text”。我尝试了KuTTypeFileURL,但这似乎也没有任何区别。我错过了什么?我看到过关于苹果如何改变PBoard以及沙箱的其他问题的帖子和讨论,但我似乎根本无法理解这一点。

    原始代码swift 3及更早版本中的工作内容

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

    这会产生以下错误 “NSStringPboardType”在Swift中不可用:请使用“PasteboardType”。字符串'

    在网上搜索后,我发现这些帖子描述了相同的问题,解决方法是使用kuTTypeUrl作为字符串

    在此处找到stackoverflow。com/questions/44537356/here论坛。开发商苹果com/线程/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 回复  |  直到 2 年前
        1
  •  8
  •   vadian    6 年前

    您正在粘贴URL,因为您创建了 PasteboardType kUTType公司 URL地址

    解决方案要简单得多,有一个预定义的 string 类型

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

    中的注释 documentation

    采用应用程序沙盒的应用程序无法访问使用字符串粘贴板类型标识的文件。相反,请使用NSURL对象、书签或文件名粘贴板类型。

    与相关 文件 (又名字符串路径),而不是常规字符串

        2
  •  0
  •   Jeehut    2 年前

    我刚刚遇到了一个类似的问题。我的代码如下所示:

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

    不幸的是,这不起作用。但我想如果你不储存 NSPasteboard.general 作为变量的一部分创建的对象 general 计算属性在 setString 更改将传播到系统。

    所以,如果你像我一样尝试在一行中这样做,只需将其拆分为两行即可,这对我很有用:

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

    我通过反馈助手向苹果(FB9988062)报告了这个bug。

    推荐文章