2017-08-03 3 views
0

J'essaie de créer une étiquette avec Swift qui sera mise à jour toutes les secondes. J'ai essayé pendant quelques heures (j'ai commencé récemment avec Swift) mais je n'ai pas été capable de le compléter. J'ai lu de la documentation et j'ai regardé les réponses des autres. , Je Jusqu'à présent ceci:Mettre à jour l'étiquette qui montre l'heure actuelle dans chaque seconde dans Swift 3

import Cocoa 

class ViewController: NSViewController { 

    @IBOutlet weak var timeLabel: NSTextField! 

    var timer = Timer() 

    let date = Date() 
    let calendar = Calendar.current 
    let dateFormatter = DateFormatter() 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    dateFormatter.dateStyle = .none 
    dateFormatter.timeStyle = .medium 
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimeLabel), userInfo: nil, repeats: true); 
    } 

    override var representedObject: Any? { 
    didSet { 
    // Update the view, if already loaded. 
    } 
    } 

    func updateTimeLabel() { 
    timeLabel.stringValue = dateFormatter.string(from: date) 
    } 

} 

donc ce que cela fait est qu'il met à jour l'étiquette de temps - mais une seule fois - et c'est lorsque la charge de la vue. Bien que j'ai ajouté un Timer dans la fonction viewDidLoad, avec un intervalle de 1 seconde, l'étiquette reste statique.

Quelqu'un pourrait me signaler ce que je fais mal ici?

Répondre

1

date est une constante dans votre code. Il ne change jamais.

Vous devez réinitialiser la date à laquelle la mise à jour a lieu.

func updateTimeLabel() { 
    timeLabel.stringValue = dateFormatter.string(from: Date()) 
} 
+0

Wow, belle prise! Je ne peux pas croire que je passais tellement de temps sur une si simple erreur. Je vous ai mis à jour, mais il ne sera pas visible tant que je n'aurai pas 15 réputation. – zec

0

dans votre cas, le updateTimeLabel est appelé après chaque seconde, mais la date variables immuable n'est pas mis à jour, car il est une fois réglée avec la date actuelle. Aussi, si vous voulez mettre à jour date constante, vous devez utiliser var au lieu de let.

pour obtenir le temps de mise à jour à chaque fois que la date de votre updateTileLabel est appelé vous devez effectuer les opérations suivantes

func updateTimeLabel() { 
    timeLabel.stringValue = dateFormatter.string(from: Date()) 
}