xcode 当我调用 2 个方法时 - 只有最后一个调用的方法运行,第一个被跳过


-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [self NextHeading]; // this plays an mp3 file
    [self NextHeadingMeaning]; // this plays an Mp3 file
}

每次仅调用[self NextHeadingMeaning]方法NextHeading并且都错过

该方法
-(IBAction) NextHeading{ 
    [audio stop]; 
    NSString *Filename = [[NSString alloc]initWithFormat:@"CH%@S%@",Heading,Meaning];
    Filepath = [[NSBundle mainBundle]pathForResource:Filename ofType:@"mp3"]; 
    audio = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:Filepath] error:NULL]; 
    audio.delegate = self; 
    [audio play]; 
    [Filename autorelease]; 
}
-(IBAction) NextHeadingMeaning { 
    [audio stop]; 
     NSString *Filename = [[NSString alloc] initWithFormat:@"CH%@S%@",bold**Chapter**bold, Meaning]; 
     Filepath = [[NSBundle mainBundle]pathForResource:Filename ofType:@"mp3"]; 
     audio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Filepath] error:NULL]; 
     audio.delegate = self; 
     [audio play]; 
     [Filename autorelease]; 
}

为什么会发生这种情况,我该如何解决?

请指教,提前谢谢。

你只是使用了一个iVar(audio)作为播放器,当你发送NextHeadingNextHeadingMeaning消息时,audio首先与你的sound_1.mp3文件一起初始化(如果mp3文件很大,则需要几秒钟),然后在下一刻(你的第一个mp3文件可能没有启动,或者已经启动, 但停止了,然后是下一条消息),您使用另一个 mp3 文件 (sound_2.mp3) 重做初始化操作,最后,当第二个 mp3 文件初始化完成时,audio播放sound_2.mp3 .这就是为什么你认为跳过NextHeading

因此,要解决此问题,您可以使用NSMutableArray iVar(例如 audioPlayers),并为NextHeadingNextHeadingMeaning创建一个本地audio,并将其推送到audioPlayers

我认为如果可以的话,最好预加载声音文件。 :)


编辑:

有一个playAtTime:方法代替play,你可以通过这种方法延迟第二个音频播放器的播放时间,就像这样:

[audioPlayer playAtTime:(audioPlayer.deviceCurrentTime + delay)];

delay以秒为单位(NSTimeInterval)。

不可能

跳过第一次调用,在其中放置断点或使用 NSLog() 输出一些东西,你会看到。最可能的原因是第一种方法没有达到您的预期,这可能是由于各种原因 - 例如条件或特定超时。

编辑:查看代码后,似乎缺少一些基本内容,例如变量命名,变量范围等。若要简单地运行代码,只需替换第二种方法中的NSString *Filename..字符串,它可能会起作用。更好的选择是访问立即开始开发iOS应用程序并遵循路线图。

最新更新