web-dev-qa-db-fra.com

Comment afficher du texte HTML à partir d'une API sur l'iPhone?

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.

45
rpheath

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.

54
Moshe
   self.textLbl.attributedText = [[NSAttributedString alloc] initWithData:    [@"html-string" dataUsingEncoding:NSUnicodeStringEncoding]
                                                                          options:@{     NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType
                                                                                     } documentAttributes:nil error:nil];
9
Pedroinpeace
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.

7
neha

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.

6
Ortwin Gentz

Vous pouvez utiliser la méthode - loadHTMLString: baseURL: de UIWebView.

Lien de référence: ici

4
David Liu

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

2
kraag22

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];
0
Anuj Kumar Rai

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.
:)
0
Mili