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()
3 Réponses :
Quelques conseils pour déboguer votre problème:
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.
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
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"]
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.
essayé d'imprimer le mot
translatedWord
et vérifié qu'il n'est pas videil imprime correctement comme je l'ai mentionné ci-dessus