每当我回到主屏幕时,它会播放已播放音乐的音乐。我尝试制作一个“显然”不起作用的if语句(因为我几乎不知道任何快速!)。这是我的主屏幕代码:
var myAudioPlayer = AVAudioPlayer()
override func viewDidLoad() {
let myFilePathString =
NSBundle.mainBundle().pathForResource("16 March of the Resistance", ofType: "m4a")
if let myFilePathString = myFilePathString
{
let myFilePathURL = NSURL(fileURLWithPath: myFilePathString)
do{
try myAudioPlayer = AVAudioPlayer(contentsOfURL: myFilePathURL)
myAudioPlayer.play()
}catch
{
print("error")
}
}
}
如何阻止它在自身上面播放?
这是我的故事板的图片
音乐播放器在StartScreen上,但当我点击后退按钮时,它会启动当前音乐播放器上的另一个音乐播放器。
我需要代码
是myAudioPlayer播放?
如果是,请不要再播放歌曲
否则发挥“3月16日的抵抗”
答案 0 :(得分:0)
你需要检查你是否已经在玩。您可以the playing
property of the AVAudioPlayer
class完成此操作。
用{:}保护你的viewDidLoad
:
if !myAudioPlayer.playing
请注意,我不知道任何Swift。
答案 1 :(得分:0)
我不确定你的“我的主屏幕”是什么意思,它是设备还是你的主要VC?你为什么要重写viewDidLoad()?之前的玩家永远不会在viewDidLoad()调用中玩,除非是泄漏,这是需要修复的。
否则,您只需要将播放器声明为可选,而不是在声明中创建它。至于重放或重叠,只需检查您的播放器是否存在,尽管您不会在viewDidLoad()中执行此操作。创建VC视图并加载视图时调用ViewDidLoad(),这与音频的生命周期无关。
根据您的要求,您可能希望在整个应用程序中播放的其他位置创建播放器,而不是在访问该VC时重新启动。否则,下面的代码将避免重复。问题是这个var myAudioPlayer = AVAudioPlayer()
会重复玩家而一个没有被释放。
var myAudioPlayer: AVAudioPlayer?
func viewDidLoad() {
// this should never be needed with correct player setup
if let player = myAudioPlayer where player.playing {
return
}
if let pathString = NSBundle.mainBundle().pathForResource("16 March of the Resistance", ofType: "m4a")
{
let url = NSURL(fileURLWithPath: pathString)
do{
try myAudioPlayer = AVAudioPlayer(contentsOfURL: url)
myAudioPlayer?.play()
} catch {
print("error")
}
}
}
<强>更新强>
所以没有必要让VC这样做。创建一个例如AudioController,甚至可以是单身人士。在AppDelegate中初始化它并在初始化后触发此播放器设置代码。您的视图控制器无需了解音频控制器。如果是如果您想从设置页面修改音量,只需访问单例对象并设置其音量即可。
这样,您可以将所有音频控制器代码保持良好分离。不要只考虑功能,考虑整体软件架构,对象具有明确的职责。让ViewControllers保持清晰,他们不应该做很多处理。
看看这个Singletons,现在很容易在Swift中设置单例。
class AudioController {
static let sharedInstance = AudioController()
var audioPlayer: AVAudioPlayer?
let kVolumeKey = "VolumeKey"
let kHasSavedInitialVolumeKey = "HasSavedInitialVolumeKey"
var volume: Float = 0.5
func setup() {
self.loadVolume()
self.setupPlayer()
}
func updatePlayerVolume(volume: Float) {
self.audioPlayer?.volume = volume
self.volume = volume
self.saveVolume()
}
func saveVolume() {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: kHasSavedInitialVolumeKey)
NSUserDefaults.standardUserDefaults().setFloat(self.volume, forKey: kVolumeKey)
NSUserDefaults.standardUserDefaults().synchronize()
}
func loadVolume() {
if NSUserDefaults.standardUserDefaults().boolForKey(kHasSavedInitialVolumeKey) {
self.volume = NSUserDefaults.standardUserDefaults().floatForKey(kVolumeKey)
}
}
func setupPlayer() {
if let pathString = NSBundle.mainBundle().pathForResource("16 March of the Resistance", ofType: "m4a")
{
let url = NSURL(fileURLWithPath: pathString)
do{
try audioPlayer = AVAudioPlayer(contentsOfURL: url)
audioPlayer?.volume = self.volume
audioPlayer?.play()
} catch {
print("error")
}
}
}
}
所以,你可以从AppDelegate的didFinishLaunching中设置播放器
AudioController.sharedInstance.setupPlayer()
然后,当您需要获取或设置时,可以使用AudioController.sharedInstance.whatever
访问AudioController。此外,您需要实现播放器委托处理歌曲结尾的方法,可能会触发播放列表中的新歌曲(为此创建新对象)或其他任何内容。您的播放器委托代码现在也很好地分开了。
答案 2 :(得分:0)
查看故事板时,似乎当您单击第二个ViewController上的“返回”按钮时,您会分配另一个开始屏幕并将其推到屏幕上。
您似乎正在使用UINavigationController
,如果这样,当点击后退按钮时,您应该致电:
self.navigationController?.popViewControllerAnimated(true)
如果你把它作为一个模态显示你应该解雇是这样的:
self.dismissViewControllerAnimated(true, completion: nil)