2017-03-06 5 views
0

誰かが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 
    } 

が、私はエラーが値タイプ「日は」(別名「ダブル」)期待される引数の型「時間間隔」に変換することはできません取得

+0

あなた自身の質問を繰り返さないでください。http://stackoverflow.com/questions/42603809/compare-selected-time-to-current-time – matt

+0

なぜ唯一の一致する時間が既に分かっているかを毎回チェックしたいのですが?最も早いマッチング時間で発生する繰り返しタイマーを使用します。たとえば、ユーザーが16:00を選択して15:00になった場合、最も早いマッチング時間は今日の16:00になります。だから、タイマーを発射するように設定してください。タイマーが起動すると、比較するものはありません。それは今の瞬間です。 – matt

+1

@mattあなたが私の他の質問を読んでいれば、彼らはお互いに異なることが分かります。他の人が何度も何度も同じ質問をして、私は偽善者ではないのです。あなたが投稿した2番目のコメントは正しく聞こえますが、私は何が間違っているのか分かりません。正しいコードで回答を投稿してください。 –

答えて

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」パラメータでピッカー日付を渡すと、タイマーはその日に発射し、あなたが提供するセレクタを実行します。

+0

その特定の時刻にコードを実行するためにタイマーを0秒に設定することは可能ですか、それともタイマーを長く設定する必要がありますか –

+0

@OrenEdrich Don 'タイマーを使用する場合は、日付が「今」の場合はタイマーを設定するかどうかをチェックし、そうであればセレクターをすぐに呼び出すことができます。そうでない場合はタイマーを設定します。 – zumzum

+0

セレクタを実行したい関数に設定し、適切なタイミングで呼び出す必要がありますか? –

関連する問題