0

didSelectRowAtIndexPath インスタンスの UITableView アイテムから AVAudioPlayer のインスタンスを制御したいと思います。

行項目の最初のタッチで、AVAudioPlayer の「再生」がトリガーされます。行項目の 2 回目のタッチで、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 に答える