2011-06-21 196 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))' –