由于您没有在问题中提供代码,因此很难对其进行调试……但是从您自己的回答来看,我很确定我知道问题所在。您将路径字符串和 URL 字符串视为可互换的,但事实并非如此。
您建议这样做:
[[inspectorView mainFrame]
loadRequest:[NSURLRequest
requestWithURL:[NSURL
URLWithString:
[[NSBundle mainBundle]
pathForResource:@"inspectorView"
ofType:@"html"
inDirectory:@"HTML/inspectorView"]]]];
(我添加了一些换行符以使其可读。)
要调用 +[NSURL URLWithString:],您需要一个表示 URL 的字符串,而不是表示路径的字符串。但是 -[NSBundle pathForResource:ofType:inDirectory:] 返回一个路径。有一个函数可以从路径构建 URL,+[NSURL fileURLWithPath:isDirectory:],如果这是你想要的。
但是,除非您需要支持 10.5 及更早版本,否则使用 -[NSBundle URLForResource:withExtension:subdirectory:] 而不是 -[NSBundle pathForResource: ofType:inDirectory:]。
所以:
[[inspectorView mainFrame]
loadRequest:[NSURLRequest
requestWithURL:[[NSBundle mainBundle]
URLForResource:@"inspectorView"
withExtension:@"html"
subdirectory:@"HTML/inspectorView"]]];
如果您想知道为什么您的代码在某些情况下有效但在其他情况下无效,请考虑“/Applications/MyApp.app/Contents/”(为了简洁起见,我将省略“Resources/HTML/inspectorView/inspectorView.html” ,因为这与此处无关)意味着当作为 URL 读取时。这是一个相对 URL;为了解释它,你取当前的基础,去掉路径部分,然后用字符串替换它。+[NSURL URLWithString:] 恰好使用“file://localhost”作为基础,这意味着你最终得到:
file://localhost/Applications/MyApp.app/Contents/
这恰好是一个有效的 URL,实际上是您想要的文件的有效 URL。这没有记录在案,但它发生了。在这种情况下。但是如果你在里面放一个空格呢?然后你得到:
file://localhost/Applications/MyApp X.app/Contents/
这不是一个有效的 URL;你想要的是这样的:
file://localhost/Applications/MyApp%20X.app/Contents/
当然,如果您调用 +[fileURLWithPath:isDirectory:] 而不是 +[URLWithString:],这正是您所得到的。
(我在这里有点作弊。实际上,NSURL 在内部分别跟踪相对 URL 和基础,并在您尝试访问 URL 时组合它们。但是您现在可以忽略它。)