2010-03-25 8 views
19

J'écris une application iPhone avec un UIWebView qui devrait afficher divers fichiers html que j'ai dans le dossier de ressources de l'application. Dans Xcode mon aperçu du projet, ces fichiers html sont affichés comme ceci:iPhone dev: charger un fichier à partir du dossier de ressources

dirA 
|---> index.html 
|---> a1.html 
|---> a2.html 
|---> my.css 
|---> dirB 
     |---> b1.html 
     |---> b2.html 
|---> dirC 
     |---> c1.html 
     |---> c2.html 

Ces ressources là où ajoutées au projet en tant que tel:

  • checked « Copier des éléments dans le dossier de groupes de destination (si nécessaire) » .
  • Type de référence: Par défaut.
  • Codage du texte: Unicode (utf-8).
  • Créer de manière récursive des groupes pour tous les dossiers ajoutés.

Les liens dans mon html sont relatives, ce qui signifie qu'ils ressemblent à ceci:

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

Pour afficher l'index.html lorsque l'application démarre, j'utilise le code suivant:

NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[webView loadRequest:request]; 

Cela fonctionne très bien. Les liens suivants provenant du fichier d'index fonctionnent également correctement, tant que les fichiers html demandés sont directement sous dirA. Si le lien suivi pointe vers un fichier dans un sous-répertoire, alors didFailLoadWithError détectera la situation et signalera que le fichier demandé n'existe pas.

En outre,

[webView loadHtmlString:myHtml]; 

ne peut pas faire partie de la solution, comme je l'ai besoin boutons avant et arrière pour travailler à mon avis Web.

Donc la question est: Comment puis-je suivre un lien relatif à un fichier html dans un sous-répertoire au sein de mes ressources?

J'ai été partout stackoverflow et le reste des tubes pour les derniers jours essayant de comprendre celui-là, mais nulle part j'ai trouvé la solution à ce problème exact. Toute idée serait très, très appréciée!

EDIT: Yoohoo! Je l'ai compris! Quelle joie! Voici ce que j'ai fait:

  1. A de nouveau importé mes ressources, en choisissant "Créer des références de dossier pour tous les dossiers ajoutés" au lieu de "Créer de manière récursive des groupes pour tous les dossiers ajoutés."
  2. spécifié le répertoire racine de ressources, comme ceci: NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"dirA"];

Répondre

13

Pour créer des dossiers dans l'ensemble d'applications, faites glisser le dossier sur Xcode et sélectionnez le bouton d'option "Créer des références de dossier pour tous les dossiers ajoutés".

+0

Oui, merci. Comme vous pouvez le voir de mon édition (de la question originale), j'ai découvert cela par moi-même quelques heures d'âge. Il semble qu'il n'y ait pas de "je l'ai finalement compris" -bit. Tant pis. Je vais juste vous donner le crédit :-) – thomax

+0

Je voudrais obtenir le même résultat mais j'ai déjà ajouté les dossiers. Y at-il de toute façon à enseigner à xcode d'organiser cela dans des dossiers par la suite? – amok

2

Les sous-répertoires que vous utilisez dans XCode sont des groupes non des dossiers réels. toutes les ressources sont probablement aplaties dans le dossier de sortie. Si vous créez des dossiers réels en dehors de XCode qui pourraient fonctionner. Essayez de créer le dossier et la hiérarchie de fichiers et faites glisser/déposer dans XCode. Vérifiez également votre dossier de construction à l'aide du Finder pour voir exactement comment XCode déploie vos fichiers.

+0

Merci pour la réponse rapide! Les dossiers sont des dossiers réels sur le système de fichiers, glisser/déposer exactement comme vous le suggérez dans XCode. Dans le dossier de construction (et dans le dossier déployé dans le simulateur), les ressources sont toutes aplanies. Aucune hiérarchie là-bas. J'ai confirmé ceci, en changeant un de mes liens pour pointer vers une ressource racine du nom de fichier qui devrait être dans un sous-répertoire; la demande a traversé. D'autres suggestions? – thomax

2

J'ai réussi à utiliser des fichiers HTML contenant des ressources et des liens en utilisant des chemins relatifs en utilisant l'initialiseur +fileURLWithPath: au lieu de +URLWithString: lors du chargement d'une chaîne HTML et en passant un baseURL dans la vue Web.

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" est mon équivalent pour votre "dirA". Aucun autre changement requis.

Questions connexes