问题是,我有三个NSNotificationcenter的设置来收听用户更改的歌曲、音量和播放列表。该应用程序可以正确地播放用户的歌曲,从播放列表中选择歌曲。
当用户选择要播放的歌曲时,它通常会注册用户播放歌曲的操作并更改playbackState,但有时它无法这样做。创造一个连续的循环,只允许游戏和游戏,而不是停止。(基本上,代码有一个间歇性错误。)
我认为问题在于,来自一个动作的NSNotificationcenter调用被另一个NSNotificationcenter调用覆盖。取消一个呼叫而不是另一个呼叫。这样,用户就无法停止播放歌曲。
App功能:允许用户从PickerView中选择播放列表,从播放列表中加载歌曲,允许用户从TableView中选择要播放的歌曲。
- (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];
}implentation+header的完整代码
http://pastebin.com/vL12zFrQ
任何帮助都会很好。
发布于 2013-09-25 13:43:43
您有两个处理程序:一个用于通知,一个用于按钮操作(看起来您在应用程序中创建了一个play/pause按钮)。
您应该从按钮处理程序中删除这一行,因为您的通知处理程序也做了同样的工作。
[self._playPauseButton setTitle:@"Play" forState:UIControlStateNormal];我也建议你这么做
if (playbackState == MPMusicPlaybackStatePlaying) {
[self.musicPlayer pause];
}
else {
[self.musicPlayer play];
}为了确保不会有任何州,你没有处理的障碍,你的方式。(通知处理程序也有相同的想法)
此外,@rckoenes的建议是好的,尝试处理每一个通知,而不仅仅是你的对象之一。
还尝试移除NSNotificationCenter的object参数中的NSNotificationCenter,然后检查它是否有效。
https://stackoverflow.com/questions/19005779
复制相似问题