2012-12-06 21 views
5

我的UIWebview使用loadHtmlString加載本地html文件。加載的頁面有其他本地html文件的鏈接以及使用互聯網的真實鏈接。iPhone UIWebView loadHtmlString未添加到歷史記錄

我添加了一個返回按鈕與:

如果([self.webView canGoBack]) [self.webView GoBack的];

這工作正常,除非它無法識別加載了loadHtmlString的原始頁面。

例如,如果我瀏覽:
地方 - >本地 - >網絡
本地X本地< - 網絡(第一回作品,接下來什麼都不做。)

我怎樣才能獲得的WebView識別原始頁面,所以後退按鈕也適用於它?我能否以某種方式將它添加到webview的歷史記錄中?

在此先感謝!

+0

我會爭辯說''loadHtmlString:'對所有人來說都是不好的做法,除了最簡單的用例。您應該考慮運行本地Web服務器。我用[CocoaHTTPServer](https://github.com/robbiehanson/CocoaHTTPServer)和[Mustache模板](https://github.com/groue/GRMustache)取得了成功。如果您可以使用HTML/JavaScript編寫整個應用程序,請考慮使用[Trigger.io](https://trigger.io/)或類似軟件。 –

+0

我的用例很簡單。簡單地將靜態頁面作爲格式書籍的一部分。 – Felix

+0

靜態頁面?太棒了,把它們保存到你的包中,並使用我在這裏描述的技術http://stackoverflow.com/a/17557309/354144 –

回答

5

我有同樣的問題。我試圖管理歷史,但它很容易出錯。現在我發現了一個更好的解決方案。

你想要做的只是添加一個loadRequest爲about:blank,並在調用loadHTMLString/loadData之前將其作爲佔位符。那麼你完全沒有監視歷史。 webview.canGoBack和canGoForward將會正常工作。當然,你需要一個黑客來處理回去的佔位符:空白。你可以在webViewDidFinishLoad中做到這一點。下面是代碼的亮點:

在當你調用loadHTMLString功能:

[weakSelf.fbWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
[weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url]; 

代碼來處理GoBack的:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    if ([webView.request.URL.absoluteString isEqualToString:@"about:blank"] 
     && ![webView canGoBack] && [webView canGoForward]) { 
    [weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url]; 
    } 
} 

我覺得還可以擴大這一解決方案來處理這些loadHTMLString這不是第一次加載。只需通過Stack來記錄所有字符串響應,並在每個loadHTMLString中插入about:blank。每次回到about:blank時彈出堆棧。

+0

好的解決方案。謝謝。 – neobie

2

這是我結束了使用的解決方法:

我創建的網頁視圖,從而保持跟蹤的用戶是否是第一頁(使用加載loadHtmlString)的委託。

當後退按鈕被按下,且WebView不能再返回,並且用戶不在第一頁上時,第一頁再次被加載(使用loadHtmlString)。這裏是相關的代碼:

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; 
    } 
} 

我不會選擇這個答案一段時間,以防萬一更優雅的解決方案彈出。

希望這可以幫助別人!

+1

如果用戶打開你的html頁面,點擊一個鏈接到另一個URL,那麼你如何切換** onFirstPage **? – onmyway133

+0

我認爲它有一個錯誤。假設你使用loadHTMLString登陸A站點。然後轉到B,然後轉到C.然後轉回到B,然後轉回到A.然後如果轉到轉發,它將直接轉到C. B缺少 –

1

Cloud Xu說,你只需要預裝虛擬HTML,像這樣:

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

只是它並沒有別的! Swift3

+0

loadRequest而不是加載。很好的答案! –