这是我的职责:
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()
}
我调试了我的应用程序,看到控制台告诉我:无法创建音频播放器
看来我的风险值是零
我该怎么修?
最佳答案
代码还有一个问题:一旦找到playIt
是nil
的原因并修复它,您就会发现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应该采用
playMusic
或String
参数;而不是String?