12024


現在テーブルビュー2枚、再生画面1枚で音楽プレイヤーを作成しています。  
[アルバム一覧(ViewController.swift)]  
↓  
[選択されたアルバムの曲一覧(songsViewController.swift)]  
↓  
[再生画面(playerViewController.swift)]  
その他に再生の制御を行うplayerController.swiftがあります。

再生に`AVAudioPlayer`を使用しており、`audioPlayerDidFinishPlaying`を検出したら通知を用いて  
どの画面にいても再生終了を検出しようとしています。  
以下はそれぞれの.swiftに書いたコードです。

【playerController.swift】  
ここに`AVAudioPlayer`も宣言されています。

[code]

    //再生終了を検出
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
        println("finish")
        //再生終了を他クラスに通知
        let notification = NSNotification(name: "getStop", object: self)
        NSNotificationCenter.defaultCenter().postNotification(notification)
    }
    
[/code]

他の三つの`ViewController`には通知を検出するコードを`viewDidLoad()`以下に書いています。  
【ViewController.swift、songsViewController.swift、playerViewController.swift】

[code]

    //再生終了を監視
    var nc: NSNotificationCenter?
    
    override func viewDidLoad() {
        super.viewDidLoad()
            nc = NSNotificationCenter.defaultCenter()
            nc?.addObserver(self, selector: "myAction", name: "getStop", object: nil)
    }
    
    //再生終了通知を受けた時に起動
    @objc func myAction() {
        //再生終了時の処理
        //次の曲へ移動する処理を書いています。
    }
    
[/code]

これでは画面遷移する度に通知登録されてしまうので、画面移動時に削除しています。

[code]

    //画面移動時に通知を削除
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        nc = NSNotificationCenter.defaultCenter()
        nc?.removeObserver(self)
    }
    
[/code]

以上のように通知に関するコードを書いたのですが、再生画面にいる時にしか再生終了時の処理が行われません。  
正確には「どのページにいても再生終了は検出するが、再生終了時の処理が行われない」となります。  
再生終了 -> `audioPlayerDidFinishPlaying`に書いた`println("finish")`が表示される ->  
セレクタである`"myAction"`の処理内容が実行されない。

どの画面にいても通知を検出するには何が足りないのでしょうか？  
アドバイスをお願いいたします。


CC BY-SA 3.0
2015-07-04T11:16:10.177
12022
2015-07-04T11:51:24.277
9857
question
swift notification
NSNotificationCenterが正常に検出できない。


`viewDidLoad()`はその名の通り、Viewが生成されたタイミングでしか呼び出されません。

複数の`ViewController`を跨いで通知を受け取りたい場合、`NSNotificationCenter`の`addObserver()`で登録するタイミングを、`viewDidAppear()`に変更してみてはどうでしょうか。


CC BY-SA 3.0
2015-07-04T11:51:24.277
12024
2015-07-04T11:51:24.277
5337
12022
answer