2010-08-30 63 views
0

我想從didSelectRowAtIndexPath實例中的UITableView項目控制AVAudioPlayer的實例。didSelectRowAtIndexPath - 訪問tapCount或類似

首先觸摸行項觸發AVAudioPlayer的「播放」。第二次觸摸行項會觸發AVAudioPlayer的「停止」。

我可以讓'遊戲'工作,但不能'停止'工作。此外,後續觸摸行項目會在後臺啓動另一個音頻線程。

確保1次敲擊開始音頻和2次敲擊停止音頻的最佳方式是什麼?

代碼樣本 - 這種方法PREPS音頻文件和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方法部分的情況下,語句中停止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; 
    } 

回答

1

怎麼樣:

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

在其他的話,保持玩家身邊,看看它在做什麼。

+0

如果([玩家IsPlaying模塊]){ \t [播放停止]。 \t NSLog(@「玩家測試要玩,所以停下來。」); } else { \t [player play]; (@「玩家測試*不*玩*,所以玩它。」); } 看似合理,但沒有運氣。同樣的行爲,'真正'的測試案例似乎永遠不會運行。重複觸摸選定的行打印「播放器測試*不*播放,所以播放它」一遍又一遍地在日誌中...一邊再次播放音頻。 嗯。 – pteeter 2010-08-30 22:21:21

+0

然後顯示更多代碼。聽起來像錯誤是在別的地方。比如你的AVAudioPlayer代碼。 – 2010-08-31 00:25:51

+0

代碼添加到上面的問題陳述...對不起支持標記標籤不是最直觀的@ StackOverflow。 – pteeter 2010-08-31 01:59:34

0

問題是,您每撥打一次該行就打電話makeReadyAudio。你需要檢查你是否已經做到了。例如,通過做這樣的事情:

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

當然。好的,下次我回到我的開發機器時,我會試試看。 – pteeter 2010-08-31 17:16:40

相關問題