簡體   English   中英

在Swift 4中創建迄今為止的簡單倒計時

[英]Creating a simple countdown to date in Swift 4

我正在開發一個非常簡單的應用程序,它可以倒計時。 我發現了幾個教程,但是在Swift 4中卻一無所獲。隨着我不斷收到編譯器錯誤,似乎已經發生了很多變化。

這是我的代碼:

class ViewController: UIViewController {
    @IBOutlet weak var CountdownText: UILabel!

    let formatter = DateFormatter()
    let userCalendar = NSCalendar.current

    let requestedComponent: NSCalendar.Unit = [
        NSCalendar.Unit.month,
        NSCalendar.Unit.day,
        NSCalendar.Unit.hour,
        NSCalendar.Unit.minute,
        NSCalendar.Unit.second,
    ]

    func printTime()
    {
        formatter.dateFormat = "MM/dd/yy hh:mm:ss a"
        let startTime = NSDate()
        let endTime = formatter.date(from: "12/03/18 2:00:00 p")

        func timeDifference (requestedComponent: NSCalendar.Unit, from: startTime, to: endTime!, options: [NSCalendar.Options]) {}

        CountdownText.text = "\(timeDifference.day) Days \(timeDifference.minute) Minutes \(timeDifference.second) Seconds"
    }
}

我的錯誤是:

使用未聲明的類型“ startTime”
使用未聲明的類型'endTime'

您已在printTime()函數內部和timeDifference()函數中指定了timeDifference函數,並且已在參數中定義了類型為startTime和endTime的參數,而不是類型。 用NSDate替換它們,例如:

func timeDifference (requestedComponent: NSCalendar.Unit, from: NSDate, to: NSDate, options: [NSCalendar.Options]) {}

然后使用您定義的startTime和ednTime變量調用此函數。

我也認為您應該在printTime函數之外定義timeDifference函數。

如何使用

  1. 將代碼復制到您的特定View Controller
  2. 使用格式更改日期dateString的值

日期格式“ <月> <日期>,<年> <小時>:<分鍾>:<秒>”

 Ex. "March 4, 2018 13:20:10" 

以下代碼對於實現自定義日期的倒數計時器非常有用。

//
//  DateCountDownTimer.swift
//  CountDownTimerLearning
//
//  Created by ThomasVEK on 04/03/18.
//  Copyright © 2018 TVEK Solutions. All rights reserved.
//

import Foundation



func defaultUpdateActionHandler(string:String)->(){

}

func defaultCompletionActionHandler()->(){

}

public class DateCountDownTimer{

    var countdownTimer: Timer!
    var totalTime = 60
    var dateString = "March 4, 2018 13:20:10" as String
    var UpdateActionHandler:(String)->() = defaultUpdateActionHandler
    var CompletionActionHandler:()->() = defaultCompletionActionHandler

    public init(){
        countdownTimer = Timer()
        totalTime = 60
        dateString = "March 4, 2018 13:20:10" as String
        UpdateActionHandler = defaultUpdateActionHandler
        CompletionActionHandler = defaultCompletionActionHandler
    }

    public func initializeTimer(pYear:Int, pMonth:String, pDay:Int, pHour:Int, pMin:Int, pSec:Int){

        self.dateString = "\(pMonth) \(pDay), \(pYear) \(pHour):\(pMin):\(pSec)" as String

        // Setting Today's Date
        let currentDate = Date()

        // Setting TargetDate
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MM-dd-yyyy HH:mm:ss"
        dateFormatter.timeZone = NSTimeZone.local
        let targedDate = dateFormatter.date(from: dateString) as! Date

        // Calculating the difference of dates for timer
        let calendar = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: currentDate, to: targedDate)
        let days = calendar.day!
        let hours = calendar.hour!
        let minutes = calendar.minute!
        let seconds = calendar.second!
        totalTime = hours * 60 * 60 + minutes * 60 + seconds
        totalTime = days * 60 * 60 * 24 + totalTime
    }

    func numberOfDaysInMonth(month:Int) -> Int{
        let dateComponents = DateComponents(year: 2015, month: 7)
        let calendar = Calendar.current
        let date = calendar.date(from: dateComponents)!

        let range = calendar.range(of: .day, in: .month, for: date)!
        let numDays = range.count
        print(numDays)
        return numDays
    }

    public func startTimer(pUpdateActionHandler:@escaping (String)->(),pCompletionActionHandler:@escaping ()->()) {
        countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
        self.CompletionActionHandler = pCompletionActionHandler
        self.UpdateActionHandler = pUpdateActionHandler
    }

    @objc func updateTime() {
        self.UpdateActionHandler(timeFormatted(totalTime))

        if totalTime > 0 {
            totalTime -= 1
        } else {
            endTimer()
        }
    }

    func endTimer() {
        self.CompletionActionHandler()
        countdownTimer.invalidate()
    }

    func timeFormatted(_ totalSeconds: Int) -> String {
        let seconds: Int = totalSeconds % 60
        let minutes: Int = (totalSeconds / 60) % 60
        let hours: Int = (totalSeconds / 60 / 60) % 24
        let days: Int = (totalSeconds / 60 / 60 / 24)
        return String(format: "%dD %02dH %02dM %02dS", days, hours, minutes, seconds)
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM