在将某些内容添加到NSPasteboard时收到通知

时间:2010-08-31 15:32:47

标签: objective-c cocoa

在我的应用程序中,我希望在NSPasteboard中添加一些内容时收到通知。如果我从任何其他程序中复制文本,我希望我的应用程序了解它。

我读到的地方不可能那样做。我应该创建一个计时器并自己检查NSPasteboard的内容。

这是方法吗?或者有任何类型的通知吗?

2 个答案:

答案 0 :(得分:11)

是的,您基本上必须轮询粘贴板以查看其内容是否已更改。这不是理想的,但它是可能的。基本上,你有一个计时器,每秒触发一次或两次并检查-[NSPasteboard changeCount]。如果changeCount发生更改,则表示粘贴板的内容也已更改(或者至少有新的所有者)。

答案 1 :(得分:4)

根据Dave DeLong提供的答案,我提出了类似的实现,但是在快速中,这是其要点的链接:PasteboardWatcher.swift

相同的代码段:

class PasteboardWatcher : NSObject {

    // assigning a pasteboard object
    private let pasteboard = NSPasteboard.generalPasteboard()

    // to keep track of count of objects currently copied
    // also helps in determining if a new object is copied
    private var changeCount : Int

    // used to perform polling to identify if url with desired kind is copied
    private var timer: NSTimer?

    // the delegate which will be notified when desired link is copied
    var delegate: PasteboardWatcherDelegate?

    // the kinds of files for which if url is copied the delegate is notified
    private let fileKinds : [String]

    /// initializer which should be used to initialize object of this class
    /// - Parameter fileKinds: an array containing the desired file kinds
    init(fileKinds: [String]) {
        // assigning current pasteboard changeCount so that it can be compared later to identify changes
        changeCount = pasteboard.changeCount

        // assigning passed desired file kinds to respective instance variable
        self.fileKinds = fileKinds

        super.init()
    }
    /// starts polling to identify if url with desired kind is copied
    /// - Note: uses an NSTimer for polling
    func startPolling () {
        // setup and start of timer
        timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("checkForChangesInPasteboard"), userInfo: nil, repeats: true)
    }

    /// method invoked continuously by timer
    /// - Note: To keep this method as private I referred this answer at stackoverflow - [Swift - NSTimer does not invoke a private func as selector](http://stackoverflow.com/a/30947182/217586)
    @objc private func checkForChangesInPasteboard() {
        // check if there is any new item copied
        // also check if kind of copied item is string
        if let copiedString = pasteboard.stringForType(NSPasteboardTypeString) where pasteboard.changeCount != changeCount {

            // obtain url from copied link if its path extension is one of the desired extensions
            if let fileUrl = NSURL(string: copiedString) where self.fileKinds.contains(fileUrl.pathExtension!){

                // invoke appropriate method on delegate
                self.delegate?.newlyCopiedUrlObtained(copiedUrl: fileUrl)
            }

            // assign new change count to instance variable for later comparison
            changeCount = pasteboard.changeCount
        }
    }
}
  共享代码中的

注意:我试图识别用户是否已复制了   文件网址与否,提供的代码可以很容易地修改为其他一般   目的。