101 votes

Swift : Afficher des données HTML dans un label ou un textView

J'ai des données HTML qui contiennent des titres, des paragraphes, des images et des listes.

Existe-t-il un moyen d'afficher ces données dans une UITextView o UILabel ?

1 votes

Utilisez UIWebView au lieu de UITextView ou UILabel. Ainsi, il affichera y compris les images

1 votes

Oui je pense que vous avez raison @TysonVignesh

0 votes

@TysonVignesh Comment puis-je utiliser UIWebView pour afficher du html ?

254voto

Roger Carvalho Points 924

Pour Swift 5 :

extension String {
    var htmlToAttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            return nil
        }
    }
    var htmlToString: String {
        return htmlToAttributedString?.string ?? ""
    }
}

Ensuite, chaque fois que vous voulez mettre du texte HTML dans une UITextView, utilisez :

textView.attributedText = htmlText.htmlToAttributedString

6 votes

Cela a bien fonctionné pour moi, mais j'ai dû utiliser label.attributedText à la place.

0 votes

Super ! J'avais juste besoin de changer les données d'encodage en unicode, pour les lettres latines d'Europe de l'Est.

0 votes

Super ! mais label.attributedText devrait être label.text lors de l'appel.

35voto

garie Points 477

Voici une version de Swift 3 :

private func getHtmlLabel(text: String) -> UILabel {
    let label = UILabel()
    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.attributedString = stringFromHtml(string: text)
    return label
}

private func stringFromHtml(string: String) -> NSAttributedString? {
    do {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        if let d = data {
            let str = try NSAttributedString(data: d,
                                             options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
                                             documentAttributes: nil)
            return str
        }
    } catch {
    }
    return nil
}

J'ai trouvé des problèmes avec certaines des autres réponses ici et il m'a fallu un peu de temps pour y arriver. J'ai défini le mode de retour à la ligne et le nombre de lignes de manière à ce que l'étiquette ait une taille appropriée lorsque le HTML s'étend sur plusieurs lignes.

0 votes

Le HTML est analysé... mais de manière incorrecte. Les balises n'apparaissent plus, mais le texte en gras n'est pas affiché. Je ne sais pas quelles sont les balises prises en charge. <b> ne l'est pas.

0 votes

Les balises en gras fonctionnent bien pour moi. Pouvez-vous afficher le code html complet qui ne fonctionne pas ? Peut-être que la police que vous utilisez n'affiche pas bien le gras.

0 votes

Le html est juste du texte provenant d'un éditeur CMS, encodé pour retourner sur une chaîne JSON. L'application accède au service web, obtient le JSON qui contient cet objet texte spécifique - l'exigence du client ici est la possibilité d'ajouter des balises html au texte, similaire à un CMS (wordpress) d'un site web. Maybe I'm encoding the return incorrectly? Lorsque j'analyse le JSON, j'imprime la chaîne de retour sur le débogage et apparaît correctement, y compris le '<b></b>', mais à la fois sur l'émulateur et l'appareil pour les tests, les balises ne fonctionnent pas. J'utilise Swift 3.

15voto

Himanshu Points 1536

Ajoutez cette extension pour convertir votre code html en une chaîne régulière :

    extension String {

        var html2AttributedString: NSAttributedString? {
            guard
                let data = dataUsingEncoding(NSUTF8StringEncoding)
            else { return nil }
            do {
                return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil)
            } catch let error as NSError {
                print(error.localizedDescription)
                return  nil
            }
        }
        var html2String: String {
            return html2AttributedString?.string ?? ""
        }
}

Puis vous affichez votre chaîne dans un UITextView ou UILabel.

textView.text = yourString.html2String ou

label.text = yourString.html2String

1 votes

Oui, mais cela ne fonctionne que pour le texte dans le HTML. J'étais également préoccupé par les images et les listes. Existe-t-il un moyen d'afficher les images et les listes en un seul objet ?

0 votes

@TalhaAhmadKhan vous pouvez directement utiliser un UIWebView si vous avez des images. Les TextView ou les étiquettes ne fonctionneront pas comme vous le savez.

7voto

Ved Rauniyar Points 915

Swift 3.0

var attrStr = try! NSAttributedString(
        data: "<b><i>text</i></b>".data(using: String.Encoding.unicode, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil)
label.attributedText = attrStr

6voto

J'utilise ceci :

extension UILabel {
    func setHTML(html: String) {
        do {
            let attributedString: NSAttributedString = try NSAttributedString(data: html.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
            self.attributedText = attributedString
        } catch {
            self.text = html
        }
    }
}

1 votes

C'est bien mais cela ne s'applique qu'à UILabel. Ce serait beaucoup mieux si c'était une extension générique qui prendrait le html et le convertirait en texte attribué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X