ここでは、NSNotificationCenter を使って、delegate メソッドが用意されていない Notification を捕まえる方法をメモする。
最初に、Notification を送ってほしいパーツというかオブジェクトに setDelegate(object) で delegate の設定をしていく。オブジェクトは送り先なので、スクリプトを書いているオブジェクト(AppController)にしたいので self にする。
@qtMovie.setDelegate(self)
まず、NSNotificationCenter オブジェクトを defaultCenter で作る。これは、どこでもいいが、最初から使いたければ awakeFromNib などに入れる。
nCenter = NSNotificationCenter.defaultCenter
これに、addObserver_selector_name_object(observer,selector,name,object) で捕まえたい Notification を追加していく。複数追加できる。observer は Notification を送りたいコントローラーなので self (AppController)、selector は Notification が送られてきたときに捕まえる delegate メソッド。name は Notification の名前、object は手本にしたところが nil だったので、nil にしておいた。
nCenter.addObserver_selector_name_object(self,:qtRateChanged,"QTMovieTimeDidChangeNotification",nil)
これで、qtRateChanged というメソッドで QTMovieTimeDidChangeNotification が捕まえられる。
これだけでは後でわからなくなりそうなので、実際に書いたスクリプトを元にサンプルを。
QTMovieTimeDidChangeNotification は、再生で時間が変わったときではなく、コントローラーなどを動かして時間が変わったときに送られるので、これを捕まえて、QuickTime ムービーの現在時間を変更する。
時間を表示するために、@currentTimeText という NSTextField (Label) の outlet を作ってある。これは 00:00:00(時:分:秒)という表示にする。
まず、QuickTime Movie を読み込んで、@qtMovie というオブジェクトを作り、それに delegate を設定する。つぎに awakeFromNib に NSNotificationCenter オブジェクトを作り QTMovieRateDidChangeNotification と QTMovieTimeDidChangeNotification を捕まえるように設定する。それぞれ、qtRateChanged と qtPointMoved というメソッドで捕まえる。
def awakeFromNib
@qtMovie.setDelegate(self)
nCenter = NSNotificationCenter.defaultCenter
nCenter.addObserver_selector_name_object(self,:qtPointMoved,"QTMovieTimeDidChangeNotification",nil)
end
QTMovieTimeDidChangeNotification が送られると、qtPointMoved というメソッドで捕まえることにしたので、そのメソッドを作る。currentTime で、QuickTime オブジェクトから QTTime が得られるので、それを QTStringFromTime で NSString の xx:xx:xx.xxx/xxx (time scale) という形で得られるので、これを to_s で Ruby の String オブジェクトにしてから .match(RegExp).to_s で xx:xx:xx の 時:分:秒の部分を取り出している。これは NSString#Match が使えないから。そして、得られた時間を @currentTimeText に setStringValue で設定する。
def qtPointMoved(notification)
@currentTimeText.setStringValue(QTStringFromTime(@qtMovie.currentTime).to_s.match(/\d\d:\d\d:\d\d/).to_s)
end
再生時間が @currentTimeText に反映されるようにするには、NSTimer を使う。それについては、NSTimer を参照。