倒计时发布日期

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

嗨,我试图处理此代码,我的问题是部分代码:

countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: (Any).self, selector: #selector(updateTime), userInfo: nil, repeats: true)

是在Xcode此错误消息

“#selector”的参数不能引用全局函数“录入()”

而我无法处理这个问题。可能是什么问题?谢谢

import UIKit
import Foundation
var releaseDate: NSDate?
var countdownTimer = Timer()

func startTimer() {

    let releaseDateString = "2019-02-23 08:00:00"
    let releaseDateFormatter = DateFormatter()
    releaseDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    releaseDate = releaseDateFormatter.date(from: releaseDateString)! as NSDate

    countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: (Any).self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}

func updateTime() {

    let currentDate = Date()
    let calendar = Calendar.current

    let diffDateComponents = calendar.dateComponents([.day, .hour, .minute, .second], from: currentDate, to: releaseDate! as Date)

    let countdown = "Days \(diffDateComponents.day ?? 0), Hours \(diffDateComponents.hour ?? 0), Minutes \(diffDateComponents.minute ?? 0), Seconds \(diffDateComponents.second ?? 0)"

    print(countdown)
}
swift timer release
1个回答
0
投票

你不能在#selector使用全局函数。因此,进入一类这个。另外,如果你要使用基于选择定时器,updateTime必须标记为@objc

另外,如果你真的想使用全局的功能,只要使用基于块的计时器:

var releaseDate: Date?
var countdownTimer = Timer()

func startTimer() {
    let releaseDateString = "2019-02-23 08:00:00"
    let releaseDateFormatter = DateFormatter()
    releaseDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    releaseDate = releaseDateFormatter.date(from: releaseDateString)

    countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
        updateTime()
    }
}

func updateTime() {
    let currentDate = Date()
    let calendar = Calendar.current

    let diffDateComponents = calendar.dateComponents([.day, .hour, .minute, .second], from: currentDate, to: releaseDate!)

    let countdown = "Days \(diffDateComponents.day ?? 0), Hours \(diffDateComponents.hour ?? 0), Minutes \(diffDateComponents.minute ?? 0), Seconds \(diffDateComponents.second ?? 0)"

    print(countdown)
}

但它会更好,把这个在structclass,以避免污染您的全局命名空间。

(另外,我不知道为什么你使用NSDate ......我建议用Date对象住。)


就个人而言,我会做一些事情,如:

class TimerManager {
    var releaseDate: Date?

    private weak var countdownTimer: Timer?

    private let formatter: DateComponentsFormatter = {
        let formatter = DateComponentsFormatter()
        formatter.unitsStyle = .full
        formatter.allowedUnits = [.day, .hour, .minute, .second]
        return formatter
    }()

    deinit {
        countdownTimer?.invalidate()
    }

    func startTimer() {
        releaseDate = DateComponents(calendar: .current, year: 2019, month: 2, day: 23, hour: 8).date

        countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
            self?.updateTime()
        }
    }

    private func updateTime() {
        guard let releaseDate = releaseDate,
            let string = formatter.string(from: Date(), to: releaseDate) else { return }
        print(string)
    }
}

这不仅需要照顾的Timer问题,而且还可以让你出的人工建造的时间差的成分的那些格式的字符串的业务。

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