为什么 AVAudioPlayer var 等于 nil? - Swift
Why the AVAudioPlayer var equals nil? - Swift
这是我的功能:
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
var 是 nil
我该如何解决?
您的代码还有另一个问题:一旦您找出为什么 playIt
是 nil
并修复它,您会发现 playMusic
运行时没有错误,但没有声音播放。 那是因为您已将 playIt
声明为 playMusic
中的局部变量。就在它开始播放时,您到达了 playMusic
的结尾,这时它的所有局部变量都超出了范围并且不复存在。 playIt
开始播放后几微秒,它就消失了。
要解决此问题,请在 playMusic
之外声明 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()
}
}
两种方式都试试——将 playIt
声明为实例变量,将 playIt
声明为 playMusic
中的局部变量。你会想选择前者。
我也支持 nhgrif 的建议:playMusic 应该采用 String
或 String?
参数;不是 String!
这是我的功能:
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
var 是 nil
我该如何解决?
您的代码还有另一个问题:一旦您找出为什么 playIt
是 nil
并修复它,您会发现 playMusic
运行时没有错误,但没有声音播放。 那是因为您已将 playIt
声明为 playMusic
中的局部变量。就在它开始播放时,您到达了 playMusic
的结尾,这时它的所有局部变量都超出了范围并且不复存在。 playIt
开始播放后几微秒,它就消失了。
要解决此问题,请在 playMusic
之外声明 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()
}
}
两种方式都试试——将 playIt
声明为实例变量,将 playIt
声明为 playMusic
中的局部变量。你会想选择前者。
我也支持 nhgrif 的建议:playMusic 应该采用 String
或 String?
参数;不是 String!