Swift | MacOS | Обновите var новым содержимым NSPasteboard на ChangeCount - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь изучить 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

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 08 мая 2020

Вы почти у цели - просто поместите код извлечения картона в крышку таймера. Однако будьте осторожны при принудительном разворачивании вещей. 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
}
...