在Swift 4中创建一个简单的倒计时倒计时

时间:2018-03-04 05:10:14

标签: ios swift

我正在研究一个非常简单的应用程序,它可以计算到某个日期。我在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'

2 个答案:

答案 0 :(得分:1)

你已经在printTime()函数和timeDifference()函数中指定了timeDifference函数,你在参数中定义了哪些类型是startTime和endTime,哪些类型不是类型。用NSDate替换它们,如:

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

然后使用已定义的startTime和ednTime变量调用此函数。

另外我认为你应该在printTime函数之外定义timeDifference函数。

答案 1 :(得分:1)

如何使用

  1. 将代码复制到特定的View Controller
  2. 使用格式为
  3. 的日期更改变量dateString的值
      

    日期格式"<月份> < date>,<年> <小时>:<分钟>:<第二个>"

    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)
        }
    
    }