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

j'ai quelques données HTML, qui contiennent des titres, des paragraphes , des images et des balises de listes.

Est-il possible d'afficher ces données dans un UITextView ou UILabel?

30
demandé sur Honey 2016-05-05 13:55:02

10 réponses

Pour Swift 4:

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

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

label.text = htmlText.htmlToString
62
répondu Roger Carvalho 2018-08-22 14:01:46

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 certains des autres réponses ici et il m'a fallu un peu pour obtenir ce droit. J'ai défini le mode de rupture de ligne et le nombre de lignes de sorte que l'étiquette ait la taille appropriée lorsque le HTML s'étend sur plusieurs lignes.

33
répondu garie 2016-11-04 17:25:49

ajouter cette extension pour convertir votre code html en 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 ?? ""
        }
}

et ensuite vous montrez votre chaîne dans UITextView ou UILabel

textView.text = yourString.html2String ou

label.text = yourString.html2String
10
répondu Himanshu 2016-09-07 03:26:54

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
6
répondu Ved Rauniyar 2017-02-01 06:17:14

j'utilise ceci:

extension UILabel {
    func setHTML(html: String) {
        do {
            let at : NSAttributedString = try NSAttributedString(data: html.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil);
            self.attributedText = at;
        } catch {
            self.text = html;
        }
    }
}
4
répondu Nikolay Khramchenko 2017-07-24 14:10:14

Swift 3

extension String {


var html2AttributedString: NSAttributedString? {
    guard
        let data = data(using: String.Encoding.utf8)
        else { return nil }
    do {
        return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:String.Encoding.utf8], documentAttributes: nil)
    } catch let error as NSError {
        print(error.localizedDescription)
        return  nil
    }
}
var html2String: String {
    return html2AttributedString?.string ?? ""
 }
}
3
répondu Alex Morel 2017-03-30 16:20:21

essaye ceci:

let label : UILable! = String.stringFromHTML("html String")

func stringFromHTML( string: String?) -> String
    {
        do{
            let str = try NSAttributedString(data:string!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true
                )!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil)
            return str.string
        } catch
        {
            print("html error\n",error)
        }
        return ""
    }

Espérons que c'est utile.

2
répondu Iyyappan Ravi 2016-09-29 11:42:12

si vous voulez HTML, avec des images et une liste, ce n'est pas pris en charge par UILabel. Cependant, j'ai trouvé YYText le truc.

1
répondu Christopher Kevin Howell 2016-05-05 15:53:05

afficher les images et les paragraphes de texte n'est pas possible dans un UITextView ou UILabel pour cela, vous devez utiliser un UIWebView.

il suffit d'ajouter l'élément dans le storyboard, lien vers votre code, et l'appeler pour charger L'URL.

OBJ-C

NSString *fullURL = @"http://conecode.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[_viewWeb loadRequest:requestObj];

Swift

let url = NSURL (string: "http://www.sourcefreeze.com");
let requestObj = NSURLRequest(URL: url!);
viewWeb.loadRequest(requestObj);

Étape par étape tutoriel. http://sourcefreeze.com/uiwebview-example-using-swift-in-ios/

1
répondu UlyssesR 2016-09-29 18:35:52

j'ai eu des problèmes pour changer les attributs du texte après cela, et je pouvais voir d'autres demandant pourquoi...

donc la meilleure réponse est d'utiliser l'extension avec Nsmutatattributedstring à la place:

extension String {

 var htmlToAttributedString: NSMutableAttributedString? {
    guard let data = data(using: .utf8) else { return nil }
    do {
        return try NSMutableAttributedString(data: data,
                                      options: [.documentType: NSMutableAttributedString.DocumentType.html,
                                                .characterEncoding: String.Encoding.utf8.rawValue],
                                      documentAttributes: nil)
    } catch let error as NSError {
        print(error.localizedDescription)
        return  nil
    }
 }

}

Et puis vous pouvez l'utiliser de cette façon:

if let labelTextFormatted = text.htmlToAttributedString {
                let textAttributes = [
                    NSAttributedStringKey.foregroundColor: UIColor.white,
                    NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 13)
                    ] as [NSAttributedStringKey: Any]
                labelTextFormatted.addAttributes(textAttributes, range: NSRange(location: 0, length: labelTextFormatted.length))
                self.contentText.attributedText = labelTextFormatted
            }
0
répondu Kassy Barb 2018-06-01 14:13:54