2010-08-15 15 views
0

Je suis relativement nouveau dans le développement de l'objectif C/iPhone.NSMutableString partagé pour le nom de fichier html local iphone

Je développe une application simple avec deux vues en utilisant un contrôleur de navigation.

La première vue contient plusieurs boutons a et la deuxième vue contient un uiwebview. L'idée est que lorsqu'un bouton est pressé, il passe à la deuxième vue et la vue web charge un fichier html local. Le fichier html chargé dépend du bouton sélectionné.

À l'heure actuelle, la vue change avec succès et je peux spécifier un fichier html à charger dans la méthode viewdidload du webviewcontroller. Cependant, cela signifie que chaque bouton déclenche le même fichier html.

Par conséquent, je veux créer une chaîne NSMutable accessible à partir des deux vues (c'est-à-dire définie sur un nom de fichier particulier dans la première vue puis récupérée lorsque la vue seoncd est chargée). J'ai cherché sur Internet pendant des heures et essayé d'utiliser des variables globales, la méthode singleton et l'accès à une variable dans l'appdelegate. Cependant, quelle que soit la méthode que j'essaie de mettre en œuvre, l'uiwebview affiche toujours le même fichier html (qui est le premier fichier alphabétiquement)

Merci pour toute aide. J'apprécie grandement toutes les suggestions.

Répondre

0

Vous n'avez pas besoin d'utiliser un NSMutableString pour cela.

Ajoutez une propriété url, juste un NSString normal, au contrôleur de deuxième vue. Avant de pousser le deuxième contrôleur d'affichage sur la pile de navigation, vous devez définir cette propriété url sur l'URL locale que vous souhaitez charger.

Ensuite, dans la deuxième vue classe contrôleur, mettre en œuvre:

- (void)setUrl:(NSString *)newUrl { 
    if(url != newUrl){ 
     [url release]; 
     url = [newUrl retain]; 
     // [webView load.... load the new url in the webView. 
    } 
} 

Cela peut être au-delà de vous les connaissances actuelles, il contient un code Objective-C vital, comme les propriétés, setters et gestion de la mémoire, mais juste essai et voyez ce que vous pouvez faire pour le faire fonctionner.

EDIT Vous n'avez même pas besoin de cette propriété. Il suffit d'implémenter une méthode comme loadUrl: dans le webViewController. Ensuite, avant de pousser webViewController, appelez cette méthode avec l'URL que vous voulez charger. Ensuite, avant de pousser webViewController, appelez cette méthode avec l'URL que vous voulez charger. Évite une propriété et se débarrasse de tout le code de gestion de la mémoire supplémentaire.

if (self.myWebViewController == nil) { 
    //initialise 
    webViewController *viewWeb = [[webViewController alloc] initWithNibName:@"webViewController" bundle:[NSBundle mainBundle]]; 
    self.myWebViewController = viewWeb; 
    [viewWeb release]; 
} 
[self.myWebViewController loadUrl:@"some-local-url"]; 
[self.navigationController pushViewController:self.myWebViewController animated:YES]; 

En note, une bonne pratique consiste à mettre en majuscule chaque nom de classe.Maintenant, vous avez une classe webViewController, mais dans Cocoa, il est courant de nommer la classe WebViewController, alors vous pouvez avoir une variable appelée webViewController. En outre, vous pouvez voir clairement si vous traitez avec objet (variable) ou juste une classe. J'ai donc oublié le fait que webView n'aura pas été chargé tant que votre vue ne sera pas chargée. Pour le résoudre, vous devrez réintroduire la propriété dont j'ai parlé plus tôt. Cette fois quelques ajustements sont faits. Dans votre classe webViewController, ajoutez le code suivant:

- (void)viewDidLoad { 
    // viewDidLoad gets automatically called once the view has loaded. Here we want to load the webView. 
    [self loadWebView]; 
} 

- (void)setUrl:(NSString *)newUrl { 
    if(url != newUrl){ 
     [url release]; 
     url = [newUrl retain]; 

     // Update the webView with the newly set URL. This will not do anything if the view hasn't been loaded, since webView will still be nil. That's why we call loadWebView again when the view gets loaded, in viewDidLoad. 
     [self loadWebView]; 
    } 
} 

- (void)loadWebView { 
    // Here you'll have to load the url. You can access it using `self.url`. 
    //[webView load... 
} 

Maintenant, dans le premier contrôleur de vue, mettre à jour [self.myWebViewController loadUrl:@"some-local-url"]; à self.myWebViewController.url = @"some-local-url";.

+0

Merci beaucoup beaucoup. J'ai ajouté une URL de propriété NSString au deuxième contrôleur de vue et ma seule question est comment puis-je appeler cette méthode setUrl du premier contrôleur de vue? – JamesTreanor

+0

S'il vous plaît voir mes mises à jour répondre. Je me suis débarrassé de la propriété car ce n'est pas vraiment nécessaire. – Joost

+0

Merci beaucoup. Cela a fonctionné presque parfaitement. Le seul problème est que lorsque j'appuie sur un bouton, il me donne un uiview vide, mais si je puis appuyez sur la barre de navigation et appuyez sur un bouton, il affiche le bon fichier html. Des idées sur la raison pour laquelle cela se produit? – JamesTreanor

0

Je suppose que le contrôleur de vue Web est initialisé à partir du contrôleur de navigation, alors pourquoi ne pas simplement passer cette chaîne lors de son initialisation. Ensuite, quand un bouton est pressé, il utilise la chaîne correcte pour inciter le contrôleur de vue Web.

Une autre idée, je pense que vous avez essayé, mais je ne suis pas sûr, c'est que le contrôleur de vue Web a une méthode et une valeur statiques. Lorsque vous appuyez sur le bouton, il appelle la méthode statique sur le contrôleur de vue Web. Ensuite, lorsque le contrôleur de vue Web se charge, il appelle une méthode statique get de la valeur.

+0

Merci pour votre réponse rapide. Voici le code qui est à l'intérieur IBAction du bouton: if (self.myWebViewController == nil) {// \t \t initialisez webViewController * viewWeb = [[webViewController alloc] initWithNibName: @ paquet "webViewController": [NSBundle mainBundle]]; \t \t self.myWebViewController = viewWeb; \t \t [version de Web de visualisation]; \t \t \t \t \t} \t [self.navigationController pushViewController: self.myWebViewController animé: OUI]; Comment puis-je "passer" la chaîne comme vous l'avez mentionné? Je suis désolé mais je ne comprends pas votre deuxième suggestion. Merci encore – JamesTreanor

+0

Etendre le contrôleur de vue Web et l'implémentation à des méthodes statiques, un getter et un setter. Avoir un NSString statique que le getter et le setter, retournent et manipulent. Quand il s'agit de charger l'URL, définissez-la à la valeur statique, via getter. Ainsi, dans une interface, le setter serait 'setURL: (NSString *) url;' et le getter serait '+ (NSString *) getURL; + (void) 'alors dans l'implémentation le setter ' + (void) setURL: (NSString *) aUrl {statique myUrl = aUrl} 'et le getter' + (NSString *) getURL {return myUrl} ' – NebulaFox