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

问题描述 投票:0回答:2

我正在研究一个非常简单的应用程序。我在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'

ios swift
2个回答
1
投票

如何使用

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

}

1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.