Le meilleur exemple pour expliquer ma situation est d'utiliser un article de blog. Supposons que j'ai une UITableView chargée avec le titre des articles de blog que j'ai reçus d'une API. Lorsque je clique sur une ligne, je souhaite afficher le message détaillé du blog.
Ce faisant, l'API restitue plusieurs champs, y compris le "post body" (qui est du texte HTML). Ma question est la suivante: que dois-je utiliser pour l'afficher afin qu'il s'affiche sous forme de code HTML formaté? Devrais-je utiliser un UIWebView pour cela? Je ne sais pas si vous utilisez un UIWebView lorsque vous visualisez littéralement une page Web (par exemple, initialisez-la avec une URL ou quelque chose d'autre) ou si vous pouvez lui remettre une chaîne HTML et le formater correctement.
Il y a plusieurs autres champs qui seront affichés sur cette page, tels que le titre, la catégorie, l'auteur, etc. J'utilise simplement UILabels pour ceux-là, donc pas de problèmes. Mais je ne sais pas quoi faire avec le morceau HTML. Je fais tout cela par programmation, d'ailleurs.
Si vous ne pouvez pas le savoir, je suis relativement nouveau dans le développement iOS, seulement environ deux ou trois semaines plus tard, sans arrière-plan obj-c. Donc, si UIWebView est la bonne approche, j'apprécierais aussi tout ce que vous avez "getcha!" notes, s'il y en a.
Comme David Liu l'a dit, UIWebview est la voie à suivre. Je recommanderais quelques constructions de la chaîne HTML séparément puis de la transmettre à UIWebView. Aussi, je rendrais le fond transparent, en utilisant [webView setBackgroundColor:[UIColor clearColor]]
afin que vous ayez plus de facilité à rendre les choses comme elles devraient.
Voici un exemple de code:
- (void) createWebViewWithHTML{
//create the string
NSMutableString *html = [NSMutableString stringWithString: @"<html><head><title></title></head><body style=\"background:transparent;\">"];
//continue building the string
[html appendString:@"body content here"];
[html appendString:@"</body></html>"];
//instantiate the web view
UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.frame];
//make the background transparent
[webView setBackgroundColor:[UIColor clearColor]];
//pass the string to the webview
[webView loadHTMLString:[html description] baseURL:nil];
//add it to the subview
[self.view addSubview:webView];
}
REMARQUE:
L'avantage d'utiliser un 'NSMutableString' est que vous pouvez continuer à construire votre chaîne par le biais d'une opération d'analyse complète puis la transmettre à 'UIWebView', alors qu'une 'NSString' ne peut pas être modifiée une fois créée.
self.textLbl.attributedText = [[NSAttributedString alloc] initWithData: [@"html-string" dataUsingEncoding:NSUnicodeStringEncoding]
options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType
} documentAttributes:nil error:nil];
NSString *strForWebView = [NSString stringWithFormat:@"<html> \n"
"<head> \n"
"<style type=\"text/css\"> \n"
"body {font-family: \"%@\"; font-size: %@; height: auto; }\n"
"</style> \n"
"</head> \n"
"<body>%@</body> \n"
"</html>", @"helvetica", [NSNumber numberWithInt:12], ParameterWhereYouStoreTextFromAPI];
[self.webview loadHTMLString:strForWebView baseURL:nil];
J'utilise ce code pour même définir la police pour le texte de la vue Web et passer mon ivar 'ParameterWhereYouStoreTextFromAPI' où je stocke le texte obtenu de api.
Dans le cas particulier du HTML primitif (styles de texte, balises p/br), vous pouvez également utiliser UITextView
avec une propriété non documentée:
-[UITextView setValue:@"<b>bold</b>" forKey:@"contentToHTMLString"]
Même s'il est non documenté, il est utilisé dans de nombreuses applications que je connais et n'a jusqu'à présent pas provoqué un seul rejet.
Vous pouvez utiliser la méthode - loadHTMLString: baseURL: de UIWebView.
Lien de référence: ici
La réponse de Moshe est excellente, mais si vous voulez une vue Web transparente, vous devez définir la propriété opaque sur FALSE.
Vous voudrez peut-être vérifier: Comment créer un UIWebVIew transparent
Vous pouvez l'afficher en supprimant le texte HTML/JS tel que (aligner, centrer, br>). Utilisez cette méthode si vous ciblez iOS7.0 ou une version ultérieure.
NSString *htmlFile;
htmlFile=[array valueForKey:@"results"];
NSAttributedString *attr = [[NSAttributedString alloc] initWithData:[htmlFile dataUsingEncoding:NSUTF8StringEncoding]options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:@(NSUTF8StringEncoding)}documentAttributes:nil error:nil];
NSLog(@"html: %@", htmlFile);
NSLog(@"attr: %@", attr);
NSLog(@"string: %@", [attr string]);
NSString *finalString = [attr string];
[webView loadHTMLString:[finalString description] baseURL:nil];
Mon scénario: j'ai un Textview dans un contrôleur de vue et je dois montrer des données dans le textView qui est au format HTML.
Swift 3:
func detectUrlInText() {
let attrStr = try! NSAttributedString(
data: "<b><i>\(Ldesc)</i></b>".data(using: String.Encoding.unicode, allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
desc.attributedText = attrStr
desc.font = UIFont(name: "CALIBRI", size: 14)
}
// Ldesc is the string which gives me the data to put in the textview. desc is my UITextView.
:)