Swift | MacOS |在ChangeCount上使用新的NSPasteboard内容更新var

Swift | MacOS |在ChangeCount上使用新的NSPasteboard内容更新var,swift,macos,nspasteboard,nsstatusbar,Swift,Macos,Nspasteboard,Nsstatusbar,我正试图在业余时间学习Swift,并开始了一个小型项目,目的是有目的地尝试和学习。我正在尝试创建一个MacOS应用程序,在菜单栏上显示剪贴板的前10个字符 我已经取得了一些成功,我已经设法让应用程序显示剪贴板的内容,但它只能工作一次;如果剪贴板内容发生更改,则不会更新 我发现使用ChangeCount我可以跟踪剪贴板,但是现在我被困在如何构造代码以更新菜单栏上 以下是到目前为止的相关代码: timer=timer.scheduledTimerwithTimeInterval:0.05,重复:tr

我正试图在业余时间学习Swift,并开始了一个小型项目,目的是有目的地尝试和学习。我正在尝试创建一个MacOS应用程序,在菜单栏上显示剪贴板的前10个字符

我已经取得了一些成功,我已经设法让应用程序显示剪贴板的内容,但它只能工作一次;如果剪贴板内容发生更改,则不会更新

我发现使用ChangeCount我可以跟踪剪贴板,但是现在我被困在如何构造代码以更新菜单栏上

以下是到目前为止的相关代码:

timer=timer.scheduledTimerwithTimeInterval:0.05,重复:true{t in 如果self.lastChangeCount!=self.pasteboard.changeCount{ } } var clipboardItems:[字符串]=[] 用于pasteboard.pasteboardItems中的元素!{ 如果let str=element.stringforType:NSPasteboard.PasteboardTyperawValue:public.utf8-纯文本{ 剪贴簿 } } 让ClipboardItem=StringclipboardItems[0]。prefix10//获取第一项的10个字符 让statusBar=NSStatusBar.system statusBarItem=statusBar.statusItem withLength:NSStatusItem.variableLength statusBarItem.button?.title=剪贴板项目
任何帮助都将不胜感激

您就快到了-只需将粘贴板提取代码放入计时器闭包中即可。不过,在强行展开东西时要小心。pasteboard.pasteboardItems可能为零,剪贴板项可能为空。您可以尝试以下方法:

if self.lastChangeCount != self.pasteboard.changeCount {
    var clipboardItems: [String] = []

    if let items = self.pasteboard.pasteboardItems {
        for element in items {
            if let str = element.string(forType: NSPasteboard.PasteboardType(rawValue: "public.utf8-plain-text")) {
                clipboardItems.append(str)
            }
        }
    }

    let clip = clipboardItems.first?.prefix(10) ?? "Clips"
    self.statusBarItem.button?.title = String(clip)

    self.lastChangeCount = self.pasteboard.changeCount
}

非常感谢@Loengard,但是我得到了以下错误:线程1:致命错误:在隐式展开line let clip=clipboardItems.first?的可选值时意外发现了nil??我强烈怀疑他的错误是我的,而不是你的。奇怪,因为你并没有暗中拆开任何东西。这对我来说很好。可能尝试“产品>清理生成文件夹”,然后再次运行。有时,从以前的运行中可能会留下一些积垢。