选择一个时间并在那时执行代码

时间:2017-03-06 02:53:46

标签: swift nstimer uidatepicker

我正在尝试添加一个功能,有人会从UIDatePicker中选择一个时间。一旦当前时间和所选时间匹配,将执行代码。输入时听起来相当简单,但我的代码很乱。

我曾尝试使用计时器每秒更新代码,以查看所选时间是否与iPhone内部时钟匹配。但是这对我的代码没有成功。我写的代码以1分钟的增量设置一个计时器。如果时间是9:30:21而您选择9:31,而不是在9:31执行的代码,它将在9:31:21执行。这是我的代码,非常感谢任何帮助。

@IBAction func datePickerchanged(_ sender: Any) {
    setDateAndTime()
    check()
    timercount = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(check), userInfo: nil, repeats: true)
    _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(check), userInfo: nil, repeats: true)

    let clockString: String = formatADate()

    if str == clockString{
        takePhoto = true
    }
}


func update(_ currentTime: TimeInterval) {
    let clockString: String = formatADate()
    if str == clockString{
        takePhoto = true

    }
}
func refreshView () {
    let clockString: String = formatADate()
    if str == clockString{
        takePhoto = true
    }

}
func check() {
    let fireDate = datePicker.date

    if fireDate < Date() {
        takePhoto = true
    }
}

func setDateAndTime() {
    check()
    timercount = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(check), userInfo: nil, repeats: true)
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm:ss a"
    _ = formatter.string(from: datePicker.date)
    str = dateFormatter.string(from: (datePicker?.date)!)
}
func formatADate() -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .short
    dateFormatter.dateFormat = "hh:mm:ss a"
    let date = NSDate()
    let output = dateFormatter.string(from: date as Date)
    print(output)
    return output
}

我尝试使用此代码:

func check() {
        let fireDate = datePicker.date
        let timer = Timer(timeInterval: fireDate, target: self, selector: Selector(take), userInfo: 0, repeats: false)
        RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)
        if fireDate < Date() {
            takePhoto = true
        }
    }
    func take() {
        takePhoto = true
    }

但我收到错误无法转换价值类型&#39;日期&#39;期望参数类型&#39; timeinterval&#39; (又名&#39; double&#39;)

1 个答案:

答案 0 :(得分:1)

您可以简单地安排计时器在选择器给出的日期开火。

let timer = Timer(fireAt: fireDate, interval: 0, target: self, selector: #selector(<a selector you want to use...>), repeats: false)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

因此,只需在“fireAt”参数中传递选择器日期,计时器将在该日期触发并运行您提供的选择器。