2014-11-23 14 views
5

Swift ile bir ses tahtası hazırlıyorum. Harika çalışıyor ancak AVAudioPlayer örneğinin oynatılıp oynatılmadığını kontrol etmeyi deniyorum. Sesler, Sound sınıfımı sakladığım (2 değişken, başlığı ve ses url'si olan) bir diziden veri alan bir tablo görünümünde listelenir.AVAudioPlayer'ın çökme çalmasını kontrol ediyor

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var sounds: [Sound] = [] 

ve uygulama kullanıcısı böyle bir satır seçtiğinde ben ses çalma uygulamak:

benim ViewController Class benim AVAudioPlayer ve AVAudioSession yanı sıra benim sesleri dizisi var

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
      if audioPlayer.playing { 

       audioPlayer.stop() 
      } else { 
      var sound = self.sounds[indexPath.row] 

      var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
      var pathComponents = [baseString, sound.url] 
      var audioNSURL = NSURL.fileURLWithPathComponents(pathComponents) 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 
      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

Ancak satıra dokunduğumda uygulama çöküyor ve tek alıyorum "(lldb)"

Neler olduğu hakkında bir fikrin var mı? Yoksa bunu tamamen yanlış mı yapıyorum?

Ben de ViewController Sınıf ses NSURL mal beyanında zorunda:

ben bunu anladım

cevap

4

şimdiden teşekkürler, bu yüzden toplulukla paylaşmak

var session = AVAudioSession.sharedInstance() 
var audioPlayer = AVAudioPlayer() 
var audioNSURL = NSURL() 

ve ayrıca sesPlayer'ı ViewDidLoad işlevine hazırlamak için: (AV'yi başlatmak için örnek bir ses kullanmalıydım) AVAudioPlayer örneği oynuyor olmadığını ve ayrıca aday hücre tarafından yansıtılan ses çalma eğer AudioPlayer)

let samplePath = NSBundle.mainBundle().pathForResource("sample", ofType: "mp4") 
audioNSURL = NSURL.fileURLWithPath(samplePath!)! 
audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
audioPlayer.prepareToPlay() 

sonra, didSelectRowAtIndexPath yöntemi, bir kontrol edin. evet, audioplayer durdurursanız da kayıt uygulamanızda sesler ise, o zaman,

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     var sound = self.sounds[indexPath.row] 
     var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String 
     var pathComponents = [baseString, sound.url] 

     var rowSoundURL = NSURL.fileURLWithPathComponents(pathComponents)! 


     if audioPlayer.playing && rowSoundURL == audioNSURL { 

      audioPlayer.stop() 

     } else { 

      audioNSURL = rowSoundURL 

      self.audioPlayer = AVAudioPlayer(contentsOfURL: audioNSURL, error: nil) 
      self.audioPlayer.play() 

     } 

      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

    } 

unutmayın bu diğer ses çalma (audioplayer durur ve diğer ses çalar) değil, ayarlamak zorunda AVAUdioSessionCategoryPlayback olarak oturum kategorisi veya ses cihazın küçük hoparlöründen duyulacak. Böylece, ViewWillAppear işlevinde:

session.setCategory(AVAudioSessionCategoryPlayback, error: nil) 
İlgili konular