0
votes

Le texte UILabel n'est pas mis à jour même dans MainThread

UILabel.text n'est pas mis à jour dans le thread principal. labelOne est mis à jour mais labelTwo qui doit afficher le mot traduit n'est pas mis à jour. Lorsque UILabel translatedWord il imprime la chaîne de droite sur la console mais UILabel n'est pas mis à jour.

datatask = session.dataTask(with: request, completionHandler: {data, response, error in
    if error == nil {
        let receivedData = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any]

        DispatchQueue.main.async {
            self.labelOne.text = wordTobeTranslated

            let data = "\(String(describing: receivedData!["text"]))"
            let all =   data.components(separatedBy: "(")
            let afterAll = all[2]
            let last = afterAll.components(separatedBy:")" )

            self.translatedWord = last[0]

            self.importantWords.append(last[0])
            self.labelTwo.text = self.translatedWord
            print(self.translatedWord)
        }
    }
})
datatask?.resume()


2 commentaires

essayé d'imprimer le mot translatedWord et vérifié qu'il n'est pas vide


il imprime correctement comme je l'ai mentionné ci-dessus


3 Réponses :


0
votes

Quelques conseils pour déboguer votre problème:

  1. Essayez de définir une chaîne codée en dur sur labelTwo et vérifiez si elle s'affiche. (ou)
  2. Mettez à jour toute valeur de labelTwo dans Storyboard et vérifiez si elle s'affiche.

Si une chaîne est affichée à partir de l'une des étapes ci-dessus, alors labelTwo est configuré correctement dans le storyboard.

Vous pouvez également essayer la méthode self.labelTwo.layoutIfNeeded() après la mise à jour du texte pour forcer la mise à jour de l'interface utilisateur.

Si aucune des étapes ne vous aide, vérifiez la couleur de la police d'UILabel. Si c'est la même couleur que l'arrière-plan, elle ne sera pas visible.


6 commentaires

la chaîne codée en dur fonctionne. il n'est pas lancé dans StoryBoard par AutoLayout. il est lancé dans subviewsdidlayout () et je change la position du parentView de ces étiquettes avant d'obtenir le mot traduit.


et j'ai changé cet UILabel en UITextView. La chaîne est affichée mais je dois faire défiler vers le bas pour voir que


Pouvez-vous toujours conserver UILabel et essayer layoutIfNeeded () dedans?


essayé mais n'a pas fonctionné. J'imprime également en tant que print (labelTwo.text!) Il imprime la chaîne que je voulais mais elle n'est pas affichée. n'est-ce pas bizarre


Veuillez vérifier la couleur de la police de UILabel. S'il s'agit de la couleur d'arrière-plan, il ne sera pas visible.


La chaîne avait des sauts de ligne, donc elle n'apparaissait pas dans l'étiquette. il est résolu en supprimant les sauts de ligne



0
votes

En regardant votre exemple de code, il semblerait que vous essayez de récupérer:

let data = String(describing: receivedData?["text"] ?? "")

de:

let data = "\(String(describing: receivedData!["text"]))"

Le problème est que \(...) dans un littéral de String entraîne une interpolation de chaîne où l'expression à l'intérieur de \( et ) sera évaluée et c'est ce qui sera placé dans la chaîne. Et la String(describing: ...) interprétera la valeur et retournera une représentation sous forme de chaîne. Alors, disons que receiveData receivedData!["text"] Text receivedData!["text"] contenait le mot "Foo". ensuite

\(String(describing: receivedData!["text"]))

Cela entraînerait des data contenant la chaîne, Optional("Foo") .

Si vous souhaitez supprimer cette partie Optional(...) , vous devez soit dérouler la partie optionnelle, soit utiliser un opérateur nil -coalescing, ?? . Et franchement, plutôt que d'utiliser l'interpolation de chaînes du tout, je ferais simplement:

describing: receivedData!["text"]


0 commentaires

0
votes

Je sais que c'est une vieille question, mais pour les nouveaux chercheurs: essayez de définir le nombre de lignes de UILabel sur zéro. Cela pourrait être un problème de contraintes.


0 commentaires