didSelectRowAtIndexPath - получить доступ к tapCount или подобному - PullRequest
0 голосов
/ 31 августа 2010

Я бы хотел управлять экземпляром AVAudioPlayer из элемента UITableView в экземпляре didSelectRowAtIndexPath.

Первое касание элемента строки вызывает «воспроизведение» 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];
}

Этот блок запускает и останавливает AVAudioPlayer в операторе case в разделе didSelectRowAtIndexPath:

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

Ответы [ 2 ]

1 голос
/ 31 августа 2010

Как насчет:

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

Другими словами, держите игрока рядом и посмотрите, что он делает.

0 голосов
/ 31 августа 2010

Проблема в том, что вы вызываете makeReadyAudio каждый раз, когда нажимаете на строку.Вы должны проверить, если вы уже сделали это.Например, сделав что-то вроде:

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