NSNotification没有打电话

时间:2013-09-25 13:05:34

标签: ios uitableview uipickerview nsnotificationcenter

问题是我有三个NSNotificationcenter设置来监听用户更改歌曲,音量和播放列表。该应用程序可以正常播放用户从播放列表中选择的歌曲。

当用户选择要播放的歌曲时,它通常会注册用户播放歌曲的动作并更改播放状态,但有时却无法这样做。创建一个只允许播放和播放而不是停止的连续循环。 (基本上代码有间歇性故障。)

我认为问题是来自一个动作的NSNotificationcenter调用被另一个NSNotificationcenter调用覆盖。取消一个呼叫而不是另一个呼叫。从而使用户无法停止播放歌曲。

应用程序功能:允许用户从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];
}

实施+标题的完整代码

http://pastebin.com/vL12zFrQ

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

你有两个处理程序:一个用于通知,一个用于按钮操作(似乎你在应用程序中创建了一个播放/暂停按钮)。

您应该从按钮处理程序中删除此行,因为您的通知处理程序执行相同的工作。

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

我也建议做

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

确保不会有任何你没有处理阻止的状态。 (和你的通知处理程序一样)

另外,@ rckoenes的建议很好,尝试处理每个通知,而不仅仅是你的一个对象。

  

还尝试删除NSNotificationCenter的object参数中的self.musicPlayer,然后检查它是否有效。