2016-04-05 8 views
0

私はViewControllerにロードする別のクラスのAVAudioPlayerを持っています。ここでは、コードです:AVAudioPlayerでサウンドが再生されませんか?

import Foundation 
import AVFoundation 

class SoundController { 

    var audioPlayer: AVAudioPlayer! 

    init() { 
    } 

    func playAudio() { 
     let path = NSBundle.mainBundle().pathForResource("ring-ring", ofType: "aiff", inDirectory: "Media")! 
     let url = NSURL(fileURLWithPath: path) 

     do { 
      print("Let's play the sound") 
      let sound = try AVAudioPlayer(contentsOfURL: url) 
      self.audioPlayer = sound 
      sound.play() 
     } catch { 
      print("Error playing sound file") 
     } 
    } 
} 

そしてここ

override func viewDidLoad() { 
     super.viewDidLoad() 

     let sound = SoundController() 
     sound.playAudio() 
    } 

すべてがコンパイルのViewControllerであり、私は「のサウンドを再生してみましょう」コンソール出力を得るが、そのデバイスに関係なく、私は、音のdoesnのテスト演奏しない。何が間違っている?

+1

どのオブジェクトがあなたの 'sound'インスタンスを生かしていますか?ここであなたのコードにそのようなものはありません。したがって、 'sound'は' -viewDidLoad'がスコープを使い果たした直後に解放されます。 – holex

+0

ここでの修正は何ですか? – Tronic

+0

多分、ARCの仕組みを理解していて、今の問題を一瞬で解決するのに役立つかもしれません。その場合、スコープの外側に強力なポインタを置いて、 'SoundController'クラスのインスタンスはインスタンス化された直後に解放されないためです。 – holex

答えて

0

audioPlayerを間違った方法で割り当てると、これはうまくいくはずです。

import Foundation 
import AVFoundation 
var audioPlayer: AVAudioPlayer! 

class SoundController { 
    class func playAudio() { 
     let path = NSBundle.mainBundle().pathForResource("ring-ring", ofType: "aiff", inDirectory: "Media")! 
     let url = NSURL(fileURLWithPath: path) 

     do { 
      print("Let's play the sound") 
      audioPlayer = try AVAudioPlayer(contentsOfURL: url) 
      audioPlayer.prepareToPlay() 
     } catch { 
      print("Error playing sound file") 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    SoundController.playAudio() 
    audioPlayer.play() 
} 
+0

チップをありがとうが、SoundControllerを別のクラスファイルにしておきたい。このようにコードを変更できますか? – Tronic

+0

でも、SoundControllerクラス全体を別のファイルにコピーするだけです。 (行5-18):) – Eric

関連する問題