La vue texte de SwiftUI ne permet pas (encore) d’afficher du texte enrichi. C’est l’occasion de créer une vue sur mesure, basée sur une vue existante de l’UIKit.UILabel permet l’affichage de texte enrichi, et la classe NSAttributedString peut convertir du html.
Commençons par créer un wrapper pour la vue UILabel. On utilise pour cela le protocole UIViewRepresentable.
Cette vue prend en paramètre une NSAttributedString pour l’afficher dans un UILabel.
- Le protocole
UIViewRepresentableutiliseUIViewType, qui est un associatedtype, c’est à dire un type abstrait qui n’est défini que lors de l’implémentation du protocole. - Avec typealias, nous donnons une valeur définitive à ce type abstrait, ce qui nous permet de déclarer les fonctions du protocole avec
UILabel. - Le protocole
UIViewRepresentablerequiert également une fonctionmakeUIView, qui doit retourner la vue UIKit souhaitée. - Enfin, La fonction
updateUIViewest appelée lorsque la vue doit être rafraîchie. Nous y mettons à jour le texte de l’UILabel.
Pour la conversion html, NSAttributedString propose un constructeur qui converti une Data. Si nous partons d’une variable String, nous devons d’abord la convertir en Data. Nous devons également prendre en compte le cas d’échec de la conversion. Dans l’exemple nous retournons une chaine vide :
Il ne reste qu’à utiliser la vue sous cette forme :