使用Xcode中的滑块创建倒计时监视

时间:2017-10-09 10:42:29

标签: ios iphone swift xcode cocoa-touch

大家好我需要一些帮助。

我正在尝试创建一个可以从小时,小时和秒钟倒计时的倒计时手表。现在我只能创建秒的倒计时但我希望应用程序能够更新我用滑块“滑动”的秒,分钟和小时。我发现很难正确更新标签并为应用程序添加“小时和分钟”。有人可以帮我弄清楚逻辑吗?

这是我到目前为止编写的代码,它只能在几秒钟内正常运行..我还添加了一个音频文件,最终会在代码中看到。

class ViewController: UIViewController {

var secondsCount = 30;
var timer = Timer()
var audioPlayer = AVAudioPlayer()

@IBOutlet weak var label: UILabel!
@IBOutlet weak var labelmin: UILabel!


    // Slideren som slider tid for sal 1
@IBOutlet weak var sliderOutlet: UISlider!
@IBAction func slider(_ sender: UISlider)
{
    //Live changes the numbers
    secondsCount = Int(sender.value)
    label.text = String(secondsCount) + " Seconds"

}


    //Start button
@IBOutlet weak var startOutlet: UIButton!
@IBAction func start(_ sender: Any)
{
        //Nederstående kode aktiverer funktionen counter()
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.counter), userInfo: nil, repeats: true)

    sliderOutlet.isHidden = true
    startOutlet.isHidden = true
}

    //Counter function
func counter() {
    secondsCount -= 1

    label.text = String(secondsCount) + " Seconds"

    if (secondsCount == 0)
    {
        timer.invalidate()

        audioPlayer.play()
    }
}

    //Stop button
@IBOutlet weak var stopOutlet: UIButton!
@IBAction func stop(_ sender: Any)
{
    timer.invalidate()
    secondsCount = 30
    sliderOutlet.setValue(30, animated: true)
    label.text = "30 Seconds"

    audioPlayer.stop()

    sliderOutlet.isHidden = false
    startOutlet.isHidden = false
}


    // viewDidLoad

override func viewDidLoad()
{
    super.viewDidLoad()

    do
    {
        let audioPath = Bundle.main.path(forResource: "1", ofType: ".mp3")

        try audioPlayer = AVAudioPlayer(contentsOf: URL(fileURLWithPath: audioPath!))

    }
    catch
    {
        //ERROR
    }



}

1 个答案:

答案 0 :(得分:1)

以下一种方式将秒数转换为格式化的小时,分​​钟,秒字符串:

func hmsFromSecondsFormatted(seconds: Int) -> String {

    let h = seconds / 3600
    let m = (seconds % 3600) / 60
    let s = seconds % 60

    var newText = ""

    if h > 0 {
        newText += "\(h)"
        if h == 1 {
            newText += " hour, "
        } else {
            newText += " hours, "
        }
    }

    if m > 0 || h > 0 {
        newText += "\(m)"
        if m == 1 {
            newText += " minute, "
        } else {
            newText += " minutes, "
        }
    }

    newText += "\(s)"
    if s == 1 {
        newText += " second"
    } else {
        newText += " seconds"
    }

    return newText

}

然后你可以像这样使用它:

label.text = hmsFromSecondsFormatted(secondsCount)

多个if条件为您提供了两件事:

  1. 单数/复数时间组件名称的结果(所以你得到“1秒”而不是“1秒”),

  2. 仅返回必要的时间组件。因此,45秒返回“45秒”而不是“0小时0分45秒”

  3. 在您的实际应用中,您可能还会使用本地化字符串作为时间组件名称。

    希望有所帮助:)