开发者

didSelectRowAtIndexPath - access tapCount or similar

I'd like to control an instance of AVAudioPlayer from a UITableView item in a didSelectRowAtIndexPath instance.

First touch of the row item triggers 'play' of the AVAudioPlayer. Second touch of the row item triggers 'stop' of 开发者_StackOverflowthe AVAudioPlayer.

I can make the 'play' work but can't get the 'stop' to work. Also, subsequent touches of the row item starts another thread of the audio in the background.

What's the best way to ensure 1 tap starts the audio and a 2nd tap stops it?

Code samples - this method preps audio file and AVAudioPlayer for use:

- (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];
}

This block will start & stop the AVAudioPlayer within a case statement in the didSelectRowAtIndexPath section:

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;
    }


How about:

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

In other words, keep the player around and see what it is doing.


The problem is that you call makeReadyAudio every single time the row is tapped. You need to check if you have already done that. For example by doing something like:

if (musicPlayer == nil) {
    [self makeReadyAudio];
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜