Swift中的流控制 - AVAudioPlayer

时间:2015-09-21 04:33:47

标签: ios iphone swift

我写了一个Iphone Swift应用程序,它使用AVAudioPlayer以随机顺序播放一系列声音 - 现在是流行音,喇叭声和锣声。当你按下播放按钮时它会起作用,除了....

然而,当我按下停止按钮时没有任何反应 - 它没有响应(如果我只有一个声音,则停止工作)。我相信这是由于我的流量控制。如果我没有输入'而soundPlayer.playing == true {}',则代码将会#34; fly"通过声音,而不是等待它完成。

如何修改代码,以便在转到下一个声音之前声音播放完毕?并且还允许停止按钮功能?请参阅下面的代码和屏幕截图。 (实际上Stack溢出不允许我发布图像,因为我是新的)

//
//  ViewController.swift
//  InsultSchool2 Swift
//
//  Created by JR on 12/3/14.
//  Copyright (c) 2014 JR. All rights reserved.
//

import UIKit
import AVFoundation

//---------------------------------------------------

var soundPlayer:AVAudioPlayer = AVAudioPlayer()

// used to try to do some kind of flow control. May not be needed if better way is found.
var stopFlag:Bool = false

//-----------------------------------------------------

class ViewController: UIViewController {

    @IBOutlet weak var valueSliderTime: UISlider!
    @IBOutlet weak var valueLabelTime: UILabel!
    @IBOutlet weak var valueStepperVolume: UIStepper!
    @IBOutlet weak var valueLabelVolume: UILabel!

//------------------------------------------------------

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        //Displays an initial Volume value in volume label on load
        //Convert to an int. Otherwise you get a weird value when getting close to zero
        //Multiply by 10 so the int works. Otherwise you would int'ing a number between 0.0 and 1.0.
        // "\()" is a shorthand to convert whatever to a string
        valueLabelVolume.text = "\(Int(valueStepperVolume.value * 10))"
    }

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


//------------------------------------------------------


    @IBAction func buttonStop(sender: UIBarButtonItem) {
        NSLog("Enter Button Stop")
        //?1 If a sound is not playing and stop is hit, then it crashes
        //?2 the stop button does not work with the whlle loop below
        soundPlayer.stop()
    }

    @IBAction func sliderTime(sender: UISlider) {
        valueLabelTime.text = "\(Int(valueSliderTime.value))"
    }

    @IBAction func stepperVolume(sender: UIStepper) {
        //Converted to an int. Otherwise you get a weird value when getting close to zero
        valueLabelVolume.text = "\(Int(valueStepperVolume.value * 10))"
    }

    @IBAction func buttonPlay(sender: UIBarButtonItem) {
        NSLog("Enter Button Start")

        var soundArray:[String] = ["Sound0", "Sound1", "Sound2"]

        // Randomizes a number to indicate which random sound to play in the array
        /* Number is from 0 to number in the (). Don't add one or 0 will never play. Go one more than the numbers in the array. For example if you have  3 items in the array go to 3. THis will go from 0 to 2 (ie., 3 items)*/
        // Reference----- var soundRandomNumber:Int = Int(arc4random_uniform(3))
        var soundRandomNumber:Int
        soundRandomNumber = Int(arc4random_uniform(3))


        //Creates a random number to wait between sounds based on the slider value.
        //arc4random requires a UInt32 (Unsigned is a positive number).
        //_uniform is slightly more random than without the Uniform
        //The documentation says to use Int otherwise.
        println(Int(valueSliderTime.value))
        NSLog("valueSliderTime.value")
        var waitTimeRandomNumber = Int(arc4random_uniform(UInt32(valueSliderTime.value)))
        println(waitTimeRandomNumber)
        NSLog("waitTimeRandomNumber")

        // Constructs a string with the random number for the URL
        //var soundFile:String = soundArray[soundRandomNumber]
        var soundFile:String
        soundFile = soundArray[soundRandomNumber]

        //Reference---- var soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3")

        var soundURL:NSURL!
        soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3")
        soundPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil)


        //?3 How do I set up a loop or control that works until the stop button is pressed?
            while stopFlag == false{
                NSLog("inside while")
                println(stopFlag)


                //?4 Is the below correct? The actual volume does not seem to change though the .volume does
                soundPlayer.volume = Float(valueStepperVolume.value)
                println(Float(valueStepperVolume.value))
                NSLog("Float(valueStepperVolume.value)")
                println(soundPlayer.volume)
                NSLog("soundPlayer.volume")

                soundRandomNumber = Int(arc4random_uniform(3))
                soundFile = soundArray[soundRandomNumber]
                soundURL = NSBundle.mainBundle().URLForResource(soundFile, withExtension:"mp3")
                soundPlayer = AVAudioPlayer(contentsOfURL: soundURL, error: nil)
                soundPlayer.prepareToPlay()
                soundPlayer.play()


                //?5 How do I make the player not blow through the sound and wait until is finished
                while soundPlayer.playing == true {
                }


                //?6 How can i make a random timer that waits for a random time before relooping?
                waitTimeRandomNumber = Int(arc4random_uniform(UInt32(valueSliderTime.value)))

            }// End of while loop


        } //ends playButton IBAction

//?7 How to allow this app to play over other music in another player
}

1 个答案:

答案 0 :(得分:0)

使用repeat while语句来控制流程:

这是苹果公司开发人员参考的链接:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html

    repeat {
// move up or down for a snake or ladder
square += board[square]
// roll the dice
if ++diceRoll == 7 { diceRoll = 1 }
// move by the rolled amount
square += diceRoll
           } while square < finalSquare
print("Game over!")