Rafraîchir zone de texte pendant l'execution d'un code long
jordy
Membre
Bonjour à tous,
je cherche a créer un log qui permet à l'utilisateur d'être informé du déroulement du programme en tache de fond. Pour cela j'utilise une zone de texte dans laquelle j'affiche des messages au fur et à mesure. Le problème est que cette zone de texte ne se rafraichit qu'a la fin de l'execution du programme et pas pendant. Comment faire pour que cela se réalise pendant l'execution du code? J'ai essayé avec dispatchqueue mais sans succès. Je vous livre ici quelques lignes de mon programme avec la fonction qui ne marche pas...
je precise que le langage est du Swift écrit avec Xcode 8.
@IBAction func btnSave(_ sender: Any) {
DispatchQueue.global(qos: .background).async {
profondeur = Int((self.niveauRecherche.selectedItem?.title)!)!
//recupere l'URL saisie
let myURLString : String = self.textUrl.stringValue
let url = URL(string:self.textUrl.stringValue)
DispatchQueue.main.async {
self.txtLog.stringValue="Veryfing first URL" // c'est cela qui ne fonctionne pas
}
//verifie la validite de l'URL de départ
if self.checkURL(urlString: myURLString){
etc...
etc...
}
Existe-t-il un moyen simple de faire cela???
Merci d'avance pour votre aide
Jordy
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
Rajoute un "log" après le "DispatchQueue.main.async {" pour voir si tu rentres bien dans cette boucle, ce qui devrait être le cas.
Il manque peut-être dans cette boucle une instruction pour rafraîchir l'affichage ?
Cordialement
Nicolas
Ne fais jamais ce genre de truc:
Tu commences avec le selectedItem, qui pourrait être nil
Même s'il est nil, tu essaies d'accèder title
Même s'il n'y a pas de title, tu silences le compilateur en mettant un '!'
Ne sachant pas si la force a réussi, tu continues de construire un Int de ce qui devrait être un String, mais peut-être nil, mais peut-être un String qui n'est pas valide pour faire un Int.
Et, si l'utilisateur saisissait "1O" (une O) à la place de "10", qu'est-ce qui se passera ?
ça plante !!!
Non, tu devrais vérifier à chaque étape si les manipulations pourraient échouer.
Ou, encore mieux, vérifier le texte lors de sa saisie.
Ou, si niveauRecherche était peuplé d'une liste de Int, récupères la valeur de là, à la place de faire tout cette conversion.
Bonjour Joanna,
niveauRecherche est un NSPopUpButton qui déroule une liste qui contient des valeurs de 1 à 5 sans aucun blanc et sans la possibilité d'y entrer une autre valeur. Le test n'a donc aucun intérêt car une valeur est toujours présente par défaut.
Mais mon sujet n'est pas celui-ci. Sais-tu pourquoi le code DispatchQueue.main.async ne s'execute pas?
merci d'avance.
Dans ce cas là, tu ne devrais jamais stocker les valeurs seulement dans un composant visuel. Il faut le charger d'un modèle qui contient les valeurs.
Puis, tu peux récupérer les valeurs directe de là sans besoin de convertir des Strings
Tu as mis un breakpoint sur la ligne:
… pour vérifier si l'exécution arrive là ?