我的委托方法看起来像这样。在播放第一首歌之后,它将进入此方法并播放第二首歌曲,但是当第二首歌曲完成播放时,它将停止播放。它没有进入委托方法。我需要连续播放所有歌曲。我不确定,为什么。有人可以帮助我。
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag
{
if (flag == NO)
NSLog(@"Playback finished unsuccessfully");
else
{
//[player stop];
index++;
NSLog(@"%d",index);
path=[[NSBundle mainBundle] pathForResource:[songlist objectAtIndex:index] ofType:@"mp3"];
[player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[songlabel2 setTitle:[songlist objectAtIndex:index]];
[endtime setText:[NSString stringWithFormat:@"%.2f",[player duration]/100]];
[player play];
}
}
答案 0 :(得分:1)
由于你没有定义一个名为player
的局部变量,我假设player
是用来播放第一首歌的实例变量,你用<创建它/ p>
player = [[AVAudioPlayer alloc] initWithContentsOfURL:firstSongURL error:&error];
或类似的东西,你已经设置了委托。在audioPlayerDidFinishPlaying: successfully:
方法中,您有
[player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
表示您再次向同一个实例发送-initWithContentsOfURL:error:
。 不要在给定对象上调用两次初始化程序。结果是不可预测的,并且存在内存泄漏的可能性。您应该释放以前的AVAudioPlayer实例,例如
[player release];
然后再次使用+alloc
和-initWithContentsOfURL:error:
创建一个新实例,就像您对第一首歌所做的那样,并设置相应的委托:
player = [[AVAudioPlayer alloc] initWithContentsOfURL:secondSongURL error:&error];
player.delegate = self;
[player play];