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
?
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
?
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
Super ! J'avais juste besoin de changer les données d'encodage en unicode, pour les lettres latines d'Europe de l'Est.
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.
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.
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.
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.
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
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 ?
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
}
}
}
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.
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 ?
2 votes
@MohamedEzzat voir ce lien hackingwithswift.com/example-code/uikit/