9
votes

iPhone uiWebView loadhtmlstring non ajouté à l'historique

mon uiwebview charge un fichier HTML local à l'aide de LoadHTMLString. La page chargée contient des liens vers d'autres fichiers HTML locaux ainsi que des liens réels qui utilisent Internet.

J'ai ajouté un bouton arrière avec:

si ([Self.WebView CANGOBACK]) [Self.WebView goback];

Cela fonctionne bien, sauf qu'il ne reconnaît pas la page d'origine chargée de LoadHTMLString.

Par exemple, si je navigue sur:
Local -> Local -> Web
Local X local <- Web (le premier back travaux, le prochain ne fait rien.)

Comment puis-je obtenir le webview de reconnaître la page d'origine afin que le bouton arrière fonctionne également pour cela? Puis-je l'ajouter à l'histoire de la webview d'une manière ou d'une autre?

Merci d'avance!


4 commentaires

Je dirais que loadhtmlstring: est une mauvaise pratique pour tous les cas d'utilisation les plus simples. Vous devriez envisager d'exécuter un serveur Web local à la place. J'ai eu le succès avec COCOAHTTSERVER et Modèles de moustache . Si vous êtes capable d'écrire votre application entière dans HTML / JavaScript, envisagez d'utiliser Trigger.io ou similaire.


Mon cas d'utilisation était assez simple. Simplement servant des pages statiques dans le cadre d'un livre comme format.


Pages statiques? Génial, les sauvegardez-les sur votre paquet et utilisez la technique que je décris ici Stackoverflow.com/a/17557309/354144


Cheers Neal, bon à savoir!


4 Réponses :


2
votes

Voici la solution de contournement que j'ai fini par utiliser:

J'ai créé un délégué pour la View WebView, qui a suivi la suivi de savoir si l'utilisateur était sur la première page (chargé à l'aide de loadhtmlstring code>). P>

Lorsque vous appuyez sur la touche Retour, et que le WebView ne peut plus revenir en arrière et que l'utilisateur n'est pas sur la première page, la première page est chargée à nouveau (en utilisant loadhtmlstring code>) . Voici le code pertinent: p>

if ([self.webView canGoBack])
    [self.webView goBack];
else
{
    WebViewDelegate * customDel = (WebViewDelegate *) self.webView.delegate;
    if (customDel.onFirstPage == NO)
    {
        // Load original local page.
        [self.webView loadHTMLString:self.htmlStr baseURL:[[NSBundle mainBundle] bundleURL]];

        customDel.onFirstPage = YES;
    }
}


2 commentaires

Et si l'utilisateur ouvre votre page HTML, cliquez sur un lien vers une autre URL, puis comment pouvez-vous basculer Onfirstpage ?


Je pense que cela a un bug. Dites que vous avez atterri sur le site A avec loadhtmlstring. Ensuite, allez à B, puis allez à C. Puis retour à B et retour à A. Ensuite, si vous goforward, il restera directement à C. B est manquant



11
votes

J'ai eu un même problème. J'ai essayé de gérer l'histoire, mais c'est sujette d'erreur. Maintenant, j'ai découvert une meilleure solution de cela.

Ce que vous voulez faire est simplement d'ajouter un LoadRequest à propos de: vierge et faites cela comme un espace réservé pour vous avant d'appeler LoadHTMLString / LoadData. Ensuite, vous êtes totalement libre de surveiller l'histoire. Le webview.cangoback et CangOforward vont simplement fonctionner. Bien sûr, vous aurez besoin d'un hack pour gérer revenir à l'espace réservé à propos de: vide. Vous pouvez le faire dans WebViewDidfinishload. Voici le code en surbrillance:

dans la fonction lorsque vous appelez LoadHTMLString: xxx

code pour gérer goback: xxx < / Pré>

Je pense qu'il est également possible de développer cette solution pour gérer ces loadhtmlstring qui n'est pas la première charge. Juste en ayant une pile pour enregistrer toute la réponse à la chaîne et insérer un point vide sur chaque loadhtmlstring. Et popez la pile lorsque chaque fois remonte à environ: vide.


1 commentaires

Belle solution. Merci.



5
votes

comme Cloud Xu a déclaré que vous avez juste besoin de précharger dummy HTML, comme celui-ci:

    webView.load(URLRequest(url: URL(string: "about:blank")!))
    webView.loadHTMLString("<html><body><b>Your page data</b></body></html>", baseURL: nil)


2 commentaires

LoadRequest au lieu de la charge. Très bonne réponse!


@Nosov pavel Votre solution fonctionne avec iOS 13 ... mais ci-dessous iOS 13, ce n'est pas un travail