2011-06-21 79 views
119

我有一個UIWebView加載一個非常簡單的測試頁面(test.html的)一個非常簡單的iOS應用:加載資源

<html> 
<body> 
<img src="img/myimage.png" /> 
</body> 
</html> 

我加載此test.html文件放在進我的Web視圖:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"]; 
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; 
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; 
[webView loadHTMLString:html baseURL:baseUrl]; 

如果我引用圖像沒有相對路徑,把引用的圖像中的根路徑下的目標也能正常工作 - 在Xcode>複製包資源,但是我不能去使用我的html文件中顯示的相對路徑。必須有一種方法可以做到這一點,我有很多圖像,CSS,JavaScript文件,我想加載到Web視圖中,我不想在根目錄中擁有所有內容,並且必須更改我的Web中的所有引用應用程序。

回答

281

這是如何加載/使用本地HTML相對引用。

  1. 將資源到您的Xcode項目(我拖着一個名爲WWW文件夾從我的取景器窗口),你會得到兩個選項「創建任何添加的文件夾組」和「創建文件夾的任何添加的文件夾引用」。
  2. 選擇「創建文件夾引用..」選項。
  3. 使用如下代碼它應該像魅力一樣工作

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [webview loadRequest:[NSURLRequest requestWithURL:url]];

現在所有的相對鏈接(如IMG/.GIF,JS/ .js文件)的HTML應該得到解決。

斯威夫特3

if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") { 
     webView.load(URLRequest(url: URL(fileURLWithPath: path))) 
    } 
+1

超級和投票!任何人都可以解釋爲什麼「創建文件夾引用反對」爲所有添加的文件夾創建組?「 – Sean

+3

作爲旁註,如果您嘗試加載JavaScript文件而不是圖像,則還需要查看以下內容:http ://stackoverflow.com/a/3629479/385619 – Willster

+1

如果目錄是* n *文件夾很深的話該怎麼辦?是否可以爲目錄arg傳遞像「@」www/app「'這樣的字符串? – ray

5

我擠都成一條線(糟糕,我知道),並與它沒有任何的煩惱:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                             ofType:@"html"] 
                  isDirectory:NO]]];   
+1

在目標節點下的圖像的XCode項目中,是否使用「相對於項目」或「相對於包圍組」?我使用的是相對於項目,因爲在獲取信息對話框中,當我選擇相對於項目看起來正確時,它顯示的路徑。然而,當我選擇相對於封閉組時,它似乎正確加載圖像。現在我只是去讓我的整個頁面正確使用JavaScript和CSS和所有,謝謝! –

+0

呃!這uiwebview是如此脆弱,我開始慢慢地添加更復雜的測試到我的測試頁面(即用css而不是內聯在img標籤中設置圖像),並且它沒有工作,所以我恢復了原來的狀態,不再工作!也許我在使用uiwebview處理某種緩存? –

0

我回去和測試,並重新測試這一點,看來我可以的唯一途徑讓它工作(因爲我在img文件夾中有一些文件,而在js/css等中有一些文件)不是在html中使用我的圖像的相對路徑,而是將所有內容都引用到bundle文件夾中。太可惜了:(。

<img src="myimage.png" /> 
5

我只是這樣做:

UIWebView *webView = [[[UIWebView alloc] init] autorelease]; 

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"]; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 

哪裏 「的index.html」 相對引用圖片,CSS,JavaScript等

23

在斯威夫特:

func pathForResource(name:String ?, ofType e xt:String?,inDirectory subpath:String?) - > String?
- 名稱: Hmtl的名稱;
- 類型分機:擴展名爲文件類型。在這種情況下,「HTML」;
- inDirectory子路徑:文件所在的文件夾。在這種情況下,該文件位於根文件夾中;

let path = NSBundle.mainBundle().pathForResource("dados", ofType: "html", inDirectory: "root") 
    var requestURL = NSURL(string:path!); 
    var request = NSURLRequest(URL:requestURL); 

    webView.loadRequest(request) 
+0

感謝您的Swift代碼。與Accepted Answer –

+0

一起工作得很好歡迎! :。)@Bala Vishnu – Weles

+0

很好用,但我不得不解開'requestURL'。 – RRikesh

2

斯威夫特答案2.

UIWebView Class Reference建議不要使用webView.loadRequest(請求):

不要使用此方法加載本地HTML文件;相反,請使用 loadHTMLString:baseURL :.

在這個解決方案中,html被讀入到一個字符串中。 html的url被用來計算路徑,並將其作爲基礎url傳遞。

let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder") 
let html = try String(contentsOfURL: url) 
let base = url.URLByDeletingLastPathComponent 
webView.loadHTMLString(html, baseURL: base) 
+0

如果是這種情況,最好參考手冊中的建議內容,並在該頁面插入一段摘錄 - 目前看起來很沒有語境。 –

0

@斯威夫特3 sdbrain的回答是:

let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!) 
    webView.loadRequest(NSURLRequest.init(url: url) as URLRequest) 
0

在斯威夫特3.01使用WKWebView:

let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!) 
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest) 

這3.01調整爲一些更精細的語法變化,並保持目錄結構這樣你就可以嵌入相關的HTML文件。

+0

自3.x以後,關鍵基礎類型的NS前綴是不是已經退出?這對我來說訣竅,謝謝! 'let localURL = URL.init(fileURLWithPath:Bundle.main。路徑(forResource:「index」,ofType:「html」,inDirectory:「mapa_procesos」)!) webView.loadRequest(URLRequest(url:localURL))' –