NSNotificationCenterが正常に検出できない。
現在テーブルビュー2枚、再生画面1枚で音楽プレイヤーを作成しています。
[アルバム一覧(ViewController.swift)]
↓
[選択されたアルバムの曲一覧(songsViewController.swift)]
↓
[再生画面(playerViewController.swift)]
その他に再生の制御を行うplayerController.swiftがあります。
再生にAVAudioPlayer
を使用しており、audioPlayerDidFinishPlaying
を検出したら通知を用いて
どの画面にいても再生終了を検出しようとしています。
以下はそれぞれの.swiftに書いたコードです。
【playerController.swift】
ここにAVAudioPlayer
も宣言されています。
//再生終了を検出
func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
println("finish")
//再生終了を他クラスに通知
let notification = NSNotification(name: "getStop", object: self)
NSNotificationCenter.defaultCenter().postNotification(notification)
}
他の三つのViewController
には通知を検出するコードをviewDidLoad()
以下に書いています。
【ViewController.swift、songsViewController.swift、playerViewController.swift】
//再生終了を監視
var nc: NSNotificationCenter?
override func viewDidLoad() {
super.viewDidLoad()
nc = NSNotificationCenter.defaultCenter()
nc?.addObserver(self, selector: "myAction", name: "getStop", object: nil)
}
//再生終了通知を受けた時に起動
@objc func myAction() {
//再生終了時の処理
//次の曲へ移動する処理を書いています。
}
これでは画面遷移する度に通知登録されてしまうので、画面移動時に削除しています。
//画面移動時に通知を削除
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
nc = NSNotificationCenter.defaultCenter()
nc?.removeObserver(self)
}
以上のように通知に関するコードを書いたのですが、再生画面にいる時にしか再生終了時の処理が行われません。
正確には「どのページにいても再生終了は検出するが、再生終了時の処理が行われない」となります。
再生終了 -> audioPlayerDidFinishPlaying
に書いたprintln("finish")
が表示される ->
セレクタである"myAction"
の処理内容が実行されない。
どの画面にいても通知を検出するには何が足りないのでしょうか?
アドバイスをお願いいたします。