0

我想从 didSelectRowAtIndexPath 实例中的 UITableView 项控制 AVAudioPlayer 的实例。

第一次触摸行项目会触发 AVAudioPlayer 的“播放”。行项目的第二次触摸触发 AVAudioPlayer 的“停止”。

我可以让“游戏”发挥作用,但不能让“停止”发挥作用。此外,对行项目的后续触摸会在后台启动另一个音频线程。

确保第 1 次点击开始音频并且第 2 次点击停止音频的最佳方法是什么?

代码示例 - 此方法准备音频文件和 AVAudioPlayer 以供使用:

- (void)makeReadyAudio {
NSString *path = [[NSBundle mainBundle] pathForResource:@"Murderers" ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:path];
NSError *error;
musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
[musicPlayer prepareToPlay];
}

此块将在 didSelectRowAtIndexPath 部分的 case 语句中启动和停止 AVAudioPlayer:

case 7: {
        //touch to start audio sound playing, touch again to  stop playing
        [self makeReadyAudio];
        if ([musicPlayer isPlaying]) {
            [musicPlayer stop];
            NSLog(@"musicPlayer tested to be playing, so stop it.");
        } else {
            [musicPlayer play];
            NSLog(@"musicPlayer tested to be *not* playing, so play it.");
        }
        break;
    }
4

2 回答 2

1

怎么样:

- (void) didSelectRowAtIndexPath:
{
    if (player.isPlaying) {
        [player stop];
    } else {
        [player start];
    }
}

换句话说,让玩家留在身边,看看它在做什么。

于 2010-08-30T22:05:34.787 回答
0

问题是您makeReadyAudio每次点击该行时都会调用。你需要检查你是否已经这样做了。例如,通过执行以下操作:

if (musicPlayer == nil) {
    [self makeReadyAudio];
}
于 2010-08-31T16:12:23.513 回答