Afficher du HTML dans SwiftUI

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.

Swift

Cette vue prend en paramètre une NSAttributedString pour l’afficher dans un UILabel.

  • Le protocole UIViewRepresentable utilise UIViewType, 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 UIViewRepresentable requiert également une fonction makeUIView, qui doit retourner la vue UIKit souhaitée.
  • Enfin, La fonction updateUIView est 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 :

Swift

Il ne reste qu’à utiliser la vue sous cette forme :

Swift