可能重复:
iOS SDK : playing music on the background and switching views
大家好我正在使用此代码在我的应用程序启动时播放背景音乐。但是当我将视图切换到我的SecondView并返回到我的Firstview时,音乐重新开始并重叠当前播放的音乐并保持当我回到我的Firstview时重叠音乐,当我从SecondView切换回我的Firstview时,如何让音乐重新开始。
FirstViewController.m
- (void)viewDidLoad {
NSString *path = [[NSBundle mainBundle] pathForResource:@"drums" ofType:@"mp3"];
theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPathath] error:NULL];
theAudio.delegate = self;
theAudio.numberOfLoops = -1;
[theAudio play];
答案 0 :(得分:3)
您可以使用NSUserDefaults保存音乐播放状态,因此在加载视图时,只有在尚未播放的情况下才能播放音乐。
if ([[NSUserDefaults standardUserDefaults] stringForKey:@"music"] == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"drums" ofType:@"mp3"];
theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPathath] error:NULL];
theAudio.delegate = self;
theAudio.numberOfLoops = -1;
[theAudio play];
[[NSUserDefaults standardUserDefaults] setObject:@"-" forKey:@"music"]; }
退出应用时,您需要将此密钥重置为nil。否则,如果玩家退出应用程序,下次应用程序重新启动时,@"音乐"字符串不会是零。
转到 projectAppDelegate.m 文件:
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"music"]; }
如果在整个应用程序中播放音乐,请按照以下所示放置音乐播放代码以确保安全。别忘了在projectAppDelegate.h文件中声明AVAudioPlayer * theAudio。
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSString *path = [[NSBundle mainBundle] pathForResource:@"drums" ofType:@"mp3"];
theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPathath] error:NULL];
theAudio.delegate = self;
theAudio.numberOfLoops = -1;
[theAudio play];
[[NSUserDefaults standardUserDefaults] setObject:@"-" forKey:@"music"]; }
我可能在这里错过了一些内容。只需运行一些测试,就可以按照自己喜欢的方式进行操作。我刚尝试了我的应用程序,它对我有用。
答案 1 :(得分:1)
两个选项,
1-在第一个视图消失时停止播放器。
[theAudio stop] in `viewWillDisappear`
2-如果你不想再回来玩。
在appDelegate类中声明theAudio
。并在分配之前检查是否已分配。
if(!appDelegate.theAudio)
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"drums" ofType:@"mp3"];
appDelegate.theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPathath] error:NULL];
theAudio.delegate = self;
theAudio.numberOfLoops = -1;
[theAudio play];
}
else
{
[theAudiostop];
[theAudio play];
}
答案 2 :(得分:0)
每次显示视图时,都要重新分配并重新创建AVAudioPlayer。你应该尽可能避免这种情况。作为问题的解决方案,根据您的代码,在[theAudio stop]
或viewDidDisappear
个事件中调用viewDidUnload
。当视图进入后台时,这将停止音频播放器。