这是我的职责:

func playMusic(filename :String!) {
    var playIt : AVAudioPlayer!
    let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
    if url == nil {
        println("could not find \(filename)")
        return
    }
    var error : NSError?
    playIt = AVAudioPlayer(contentsOfURL: url, error: &error)
    if playIt==nil {
        println("could not create audio player")
        return
    }
    playIt.numberOfLoops = -1
    playIt.prepareToPlay()
    playIt.play()
}

我调试了我的应用程序,看到控制台告诉我:无法创建音频播放器
看来我的风险值是零
我该怎么修?

最佳答案

代码还有一个问题:一旦找到playItnil的原因并修复它,您就会发现playMusic运行时没有错误,但没有声音播放。这是因为您已经将playIt声明为playMusic内部的局部变量。就在它开始播放的时候,你到达了playMusic的结尾,当它的所有局部变量超出范围并且不再存在。开始播放后的微秒,它消失了。
若要解决此问题,请将playIt外部的playIt声明为实例变量。下面是视图控制器的代码,它使用playMusic方法和我的一个建议更改:

import UIKit
import AVFoundation


class ViewController: UIViewController {

  // Declare playIt here instead
  var playIt : AVAudioPlayer!

  override func viewDidLoad() {
    super.viewDidLoad()

    playMusic("sad trombone.mp3")
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

  @IBAction func buttonPressed(sender: AnyObject) {

  }

  func playMusic(filename :String!) {
    // var playIt : AVAudioPlayer! *** this is where you originally declared playIt
    let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
    if url == nil {
      println("could not find \(filename)")
      return
    }
    var error : NSError?
    playIt = AVAudioPlayer(contentsOfURL: url, error: &error)
    if playIt==nil {
      println("could not create audio player")
      return
    }
    playIt.numberOfLoops = -1
    playIt.prepareToPlay()
    playIt.play()
  }

}

尝试两种方法——将playMusic声明为实例变量,并将playIt声明为playIt内部的局部变量。你想和前者一起去。
我也支持nhgrif的建议:playMusic应该采用playMusicString参数;而不是String?

10-08 08:48