0

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

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

我发现使用ChangeCount我可以跟踪剪贴板,但是我现在陷入了如何构造代码以更新菜单栏的问题。

到目前为止,这是(相关的)代码:

timer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { (t) in
    if self.lastChangeCount != self.pasteboard.changeCount {

    }
}

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

let ClipboardItem = String(clipboardItems[0].prefix(10)) // Gets 10 chars of first item

let statusBar = NSStatusBar.system
statusBarItem = statusBar.statusItem(
    withLength: NSStatusItem.variableLength)
statusBarItem.button?.title = ClipboardItem

任何帮助将非常感激。

4

1 回答 1

1

你快到了 - 只需将粘贴板提取代码放入计时器闭包中。不过,要小心强行打开东西。pasteboard.pasteboardItems可能为零,clipboardItems也可能为空。你可以尝试这样的事情:

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
}
于 2020-05-07T22:43:28.590 回答