

Swift(OS X, Cocoaアプリケーション)でクリップボードの値の変化を検知したいです  
現在，クリップボードの値を取得することはできており、ボタンを押すことでラベルに反映させることはできました。  
次のステップとして、クリップボードの値が変化したときに，ラベルに反映させたいのですが、どのようにやるのでしょうか。

[code]

    @IBAction func pushedButton(sender: AnyObject) {
        //クリップボードから値取得
        let pb = NSPasteboard.generalPasteboard()
    
        if let aaa = pb.stringForType(NSPasteboardTypeString){
            label2.stringValue = aaa
        }else{
            label2.stringValue = "クリップボードは空"
        }
    }
    
[/code]


CC BY-SA 3.0
2016-07-27T09:45:18.427
27883
2016-07-27T22:51:34.110
2016-07-27T22:51:34.110
5519
17297
question
swift xcode macos
クリップボードの値の変化を検知する方法


残念ながら、`NSPasteboard`については、

  * 変化の通知は行わない
  * 変化を伝えるようなdelegateも持たない
  * 監視対象にできるようなプロパティもない

と言うことで、自分でポーリングしてやる(定期的に変化がないか見に行く)しかないようです。

本家Stack Overflowの[質問](https://stackoverflow.com/questions/5033266/can-i-
receive-a-callback-whenever-an-nspasteboard-is-written-
to)に、[Swiftで書かれた監視用クラスのコード](https://stackoverflow.com/a/30951577/6541007)を掲載している方がおられたのでご紹介しておきます。(単に`NSTimer`を使って、定期的に`NSPasteboard`の状態に変化がないかを確認しているだけです。)

Swift2.2では警告が出るコードになっているのと、特定拡張子を持つファイルURLが書き込まれた時だけdelegateメソッドを呼ぶようになっているのですが、そこらへんは自分で研究してご自身の要求に合うように書き換えてみてください。(記事では一部delegate用プロトコルの宣言が抜けていますが、リンク先のソースを当たってください。)

使い方はこんな感じになるようです。

[code]

    //適当なクラス(普通ならAppDelegateかViewController)を`PasteboardWatcherDelegate`に適合させておく
    class MyClass: PasteboardWatcherDelegate/*,...*/ {
        //監視オブジェクトは監視したい間ずっと保持しないといけない
        private var watcher: PasteboardWatcher!
    
        //初期化用メソッドの中で
        func myMethod() {
            watcher = PasteboardWatcher(fileKinds: ["png", "jpg"])
            //このままでは循環参照ができるので、元ソースの`var delegate: PasteboardWatcherDelegate?`を
            //`weak var delegate: PasteboardWatcherDelegate?`に書き換えておいてください。
            watcher.delegate = self
        }
    
        //`PasteboardWatcherDelegate`メソッドの実装
        func newlyCopiedUrlObtained(copiedUrl copiedUrl: NSURL) {
            //ファイルURLとなる文字列が指定の拡張子を持っているとこのメソッドが呼ばれる
            print(copiedUrl)
        }
    }
    
[/code]

申し訳ありませんが、どの程度使い物になるか、私自身は試していません。(上に書いた以外にも若干修正が要るかもしれません。)紹介した記事の質問が書かれたのは5年以上も前なのに、いまだにAppleが動いていないところを見ると、システム全体で共用するリソースであるはずのクリップボードの内容を、特定アプリが簡単に監視して独占してしまうのが嫌なのかもしれません。


CC BY-SA 3.0
2016-07-27T11:55:51.930
27887
2016-07-27T11:55:51.930
2017-05-23T12:38:55.307
-1
13972
27883
answer