2017-03-06 4 views
0

J'essaie d'ajouter une fonctionnalité où quelqu'un va sélectionner un formulaire UIDatePicker. Une fois l'heure actuelle et l'heure sélectionnée, le code sera exécuté. Cela semble assez simple lorsqu'il est dactylographié, mais mon code est un gâchis.Sélectionnez une heure et exécutez le code à ce moment-là

J'ai essayé d'utiliser une minuterie pour mettre à jour le code toutes les secondes pour voir si l'heure sélectionnée correspond à l'horloge interne de l'iPhone. Cela n'a cependant pas fonctionné avec succès avec mon code. Le code que j'ai écrit régler une minuterie par incréments de 1 minute. Si l'heure est 9:30:21 et que vous sélectionnez 9:31, au lieu du code exécuté à 9h31, il s'exécute à 09:31:21. Voici mon code, toute aide est grandement appréciée.

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

J'ai essayé d'utiliser ce code:

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 
    } 

mais je reçois une erreur ne peut pas convertir 'date' type de valeur type d'argument attendu 'TimeInterval' (alias 'double')

+0

S'il vous plaît ne répétez pas votre propre question http://stackoverflow.com/questions/42603809/compare-selected-time-to-current-time – matt

+0

Pourquoi voulez-vous vérifier chaque seconde lorsque le seul temps correspondant est déjà connu ? Utilisez une minuterie répétée qui se déclenche au plus tôt. Par exemple, si l'utilisateur sélectionne 16:00 et qu'il est maintenant 15:00, l'heure la plus proche est 16:00. Réglez donc la minuterie à feu alors. Quand la minuterie se déclenche, il n'y a plus rien à comparer: c'est le moment, à ce moment-là. – matt

+1

@matt Si vous avez lu mon autre question, vous verrez qu'ils sont différents l'un de l'autre. Je n'aime pas quand d'autres personnes posent la même question encore et encore et je ne suis pas un hypocrite. Le deuxième commentaire que vous avez posté semble correct, mais je ne suis pas sûr de ce que j'ai fait de mal, pourriez-vous poster une réponse avec le bon code ou au moins éditer votre commentaire pour me montrer où j'ai un problème. –

Répondre

1

Vous peut simplement planifier une minuterie pour tirer à la date donnée par le sélecteur.

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) 

Ainsi, il suffit de passer à la date du sélecteur dans le paramètre « fireAt » et la minuterie se déclenche à cette date et exécutez le sélecteur que vous fournissez.

+0

Est-il possible de définir une minuterie pour zéro secondes afin d'exécuter le code à ce moment précis ou devrais-je mettre le minuteur plus longtemps –

+0

@OrenEdrich Don ' t utiliser une minuterie pour ce cas, vous pouvez simplement vérifier quand vous voulez régler la minuterie si la date est "maintenant", si c'est le cas, vous pouvez appeler le sélecteur immédiatement, sinon réglez la minuterie à la place. – zumzum

+0

Donc, je devrais mettre le sélecteur à une fonction que je veux exécuter et il l'appellera au bon moment? –