アプリのリソースフォルダーにあるさまざまなhtmlファイルを表示するUIWebViewを使用してiPhoneアプリを作成しています。 xcode my project Overviewでは、これらのhtmlファイルは次のように表示されます。
dirA
|---> index.html
|---> a1.html
|---> a2.html
|---> my.css
|---> dirB
|---> b1.html
|---> b2.html
|---> dirC
|---> c1.html
|---> c2.html
これらのリソースは、そのようにプロジェクトに追加されました。
私のhtmlのリンクは相対的なものであり、次のようになります。
<a href="a1.html">a1</a>
<a href="a2.html">a2</a>
<a href="dirB/b2.html">b2</a>
<a href="dirC/c1.html">c1</a>
アプリの起動時にindex.htmlを表示するために、次のコードを使用します。
NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
これは正常に機能します。要求されたhtmlファイルがdirAの直下にある限り、インデックスファイルからのリンクをたどることも正常に機能します。たどったリンクがサブディレクトリ内のファイルを指している場合、didFailLoadWithError
は状況をキャッチし、要求されたファイルが存在しないことを報告します。
また、
[webView loadHtmlString:myHtml];
webビューで機能するには、戻るボタンと進むボタンが必要なため、ソリューションの一部にすることはできません。
したがって、質問は次のとおりです。リソース内のサブディレクトリにあるhtmlファイルへの相対リンクをたどるにはどうすればよいですか?
私は過去数日間、スタックオーバーフローと残りのチューブをくまなく調べてこれを理解しようとしましたが、この正確な問題の解決策はどこにもありません。どんな洞察も非常に、非常に高く評価されます!
編集:ユーフー!私はそれを考え出した!なんて嬉しい!これが私がしたことです:
NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"dirA"];
アプリバンドルにフォルダーを作成するには、フォルダーをXcodeにドラッグし、[追加されたフォルダーのフォルダー参照を作成する]ラジオボタンを選択します。
HTML文字列をロードしてWebビューでbaseURLを渡すときに、+fileURLWithPath:
の代わりに+URLWithString:
初期化子を使用して、相対パスを使用してリソースとリンクを含むHTMLファイルを使用することができました。
NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"HTMLContent"];
NSString* htmlString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
[self.webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]];
「HTMLContent」はあなたの「dirA」に相当します。その他の変更は必要ありませんでした。
XCodeで使用するサブディレクトリは、実際のフォルダではなくグループです。すべてのリソースが出力フォルダーにフラット化されている可能性があります。 XCodeの外部に実際のフォルダを作成すると、機能する可能性があります。フォルダとファイルの階層を作成し、XCodeにドラッグ/ドロップしてみてください。また、Finderを使用してビルドフォルダをチェックし、XCodeがファイルをどのように展開しているかを正確に確認します。