2016-10-18 8 views
0

私はオーディオファイルのリストを持っており、セルを押すとオーディオが再生されます。これは問題なく動作しますが、同じセルをもう一度クリックすると一時停止できません。Swift - 同じボタンをクリックして再生中のオーディオを一時停止する方法は?

テーブルビューのための私のコードは:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    let a = indexPath.section; 
    let b = indexPath.row; 

    var path = NSBundle.mainBundle().pathForResource(musicArray[b], ofType: "mp3") 
    var error:NSError? 

    do{ 
     audioPlayer = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!)) 
    } 
    catch 
    { 
     print("Something bad happened") 
    } 

    if (audioPlayer.playing) 
    { 
     audioPlayer.pause(); 
    } 
    else 
    { 
     audioPlayer.play(); 
    } 
} 

musicArrayは、あなたが新しいAVAudioPlayerあなたがセルを選択するたびに作成しているオーディオファイルのタイトル

+3

私は、あなたが常にdidSelectRowAtIndexPathのたびにaudioPlayerを作成していると思います。 audioPlayerは新しいものなので、再生しているオーディオプレーヤーではなく、状態は常に再生されません。これを修正するには、静的なaudioPlayerを作成するか、audioPlayerを配列に保存する必要があります。 – nynohu

答えて

1

を持っています。あなたは前のものへの参照を保持し、オーディオプレイヤーが一時停止するように指示する必要があります。

+0

これをやりなおす方法を教えてください。 –

0

シングルトンオブジェクトを作成できます。

import AVFoundation 
class SomeAudioManager: NSObject, AVAudioPlayerDelegate 
{ 
    class var sharedInstance: SomeAudioManager { 
     struct Static { 
      static var onceToken: dispatch_once_t = 0 
      static var instance: SomeAudioManager? = nil 
     } 
     dispatch_once(&Static.onceToken) { 
      Static.instance = SomeAudioManager() 
     } 
     return Static.instance! 
    } 
    func audioView(songname: String,format: String) { 
     let audioPlayer: AVAudioPlayer 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(songname, ofType:format)!), fileTypeHint: AVFileTypeMPEGLayer3) 
      audioPlayer.delegate = self; 
      audioPlayer.play() 
     } catch { 
      // error 
     } 
    } 
} 

アプリ全体を通じて存続します。

How to implement AVAudioPlayer Inside Singleton Method?

それが再生またはいない場合は、常に知っているように、あなただけのプレーヤーのシングルトンを作成することができます。

関連する問題