2013-09-25 90 views
0

問題是我有三個NSNotificationcenter的設置來偵聽用戶更改歌曲,音量和播放列表。該應用可以正常播放來自播放列表用戶選擇的歌曲。NSNotification not calling

當用戶選擇要播放的歌曲時,通常會註冊用戶操作來播放歌曲並更改播放狀態,但有時不會這樣做。創建一個只允許玩和不停止的連續循環。 (基本上,代碼存在間歇性故障。)

我相信問題是來自一個操作的NSNotificationcenter調用被另一個NSNotificationcenter調用覆蓋。取消另一個呼叫。從而使用戶無法停止播放歌曲。

應用功能:允許用戶從PickerView中選擇播放列表,從播放列表中加載歌曲並允許用戶從TableView中選擇歌曲進行播放。對於implentation +頭

- (void)addMusicPlayerObserver { 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleNowPlayingSongStateChanged:) 
               name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
               object:self.musicPlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handlePlaybackStateChanged:) 
               name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
               object:self.musicPlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleVolumeChangedFromOutSideApp:) 
               name:MPMusicPlayerControllerVolumeDidChangeNotification 
               object:self.musicPlayer]; 
    [self.musicPlayer beginGeneratingPlaybackNotifications]; 
} 

- (void)removeMusicPlayerObserver { 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
                object:self.musicPlayer]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMusicPlayerControllerPlaybackStateDidChangeNotification 
                object:self.musicPlayer]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:MPMusicPlayerControllerVolumeDidChangeNotification 
                object:self.musicPlayer]; 
    [self.musicPlayer endGeneratingPlaybackNotifications]; 
} 

的完整代碼

http://pastebin.com/vL12zFrQ

任何幫助將是巨大的。

+0

只是小小的一點,'viewDidunload'不會在iOS6或Higer中調用。在'viewWillAppear' /'viewDidDisappear'中添加和刪除觀察者。 – rckoenes

+0

乾杯。錯過了viewDidUnload不在iOS 6中:/將移動添加/刪除觀察者到viewWillAppear/viewDidDisappear :) – Evilelement

+2

也嘗試刪除'NSNotificationCenter'的'object'參數'self.musicPlayer'並檢查它是否工作然後。 – rckoenes

回答

1

您有兩個處理程序:一個用於通知,一個用於按鈕操作(看起來您在應用程序中創建了播放/暫停按鈕)。

您應該從您的按鈕處理程序中刪除此行,因爲您的通知處理程序執行相同的工作。

[self._playPauseButton setTitle:@"Play" forState:UIControlStateNormal]; 

我還建議做

if (playbackState == MPMusicPlaybackStatePlaying) { 
    [self.musicPlayer pause]; 
} 
else { 
    [self.musicPlayer play]; 
} 

,以確保不會有你不處理,阻止你途中的任何狀態。 (同樣的想法到你的通知處理程序)

此外,@ rckoenes的建議是好的,儘量處理每個通知,不僅是你的對象之一。

也嘗試刪除NSNotificationCenter的對象參數中的self.musicPlayer,並檢查它是否工作。