Problème pour afficher une UIImageView
guittonews
Membre
Bonjour à tous et merci d'avance pour l'aide que ce forum (donc vous) m'avez déjà apporté.
Cependant je sèche depuis ce matin sur le même problème (qui est à mon avis très con). Voilà ma situation : j'ai une liste de nom de photo que je récupère d'un flux xml. Quand je clic que un item j'aimerais faire un pushView d'une vue avec la photo "en grand". J'ai réussi à passer l'url de la photo en paramètre, et à afficher "partiellement ma nouvelle vue (sans la photo en fait et en utilisant un nib). N'y arrivant pas de cette manière j'ai regardé du coté de loadView (donc sans nib) et je lève une exception suite à une "bad request". Je tourne en rond sur ce problème...
Ci dessous dans le listing 1 la méthode tableView:didSelectRowAtIndexPath: de RootViewController et dans le listing 2 la méthode loadView de PhotoViewcController
Listing 1
Listing 2
Merci d'avance pour l'attention que vous porterez à mon problème.
Cordialement,
Guittonews.
Cependant je sèche depuis ce matin sur le même problème (qui est à mon avis très con). Voilà ma situation : j'ai une liste de nom de photo que je récupère d'un flux xml. Quand je clic que un item j'aimerais faire un pushView d'une vue avec la photo "en grand". J'ai réussi à passer l'url de la photo en paramètre, et à afficher "partiellement ma nouvelle vue (sans la photo en fait et en utilisant un nib). N'y arrivant pas de cette manière j'ai regardé du coté de loadView (donc sans nib) et je lève une exception suite à une "bad request". Je tourne en rond sur ce problème...
Ci dessous dans le listing 1 la méthode tableView:didSelectRowAtIndexPath: de RootViewController et dans le listing 2 la méthode loadView de PhotoViewcController
Listing 1
- (NSIndexPath *)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath<br />{ <br /> <br /> flickr_0_0_0_4AppDelegate *appDelegate = (flickr_0_0_0_4AppDelegate *)[[UIApplication sharedApplication] delegate];<br /> PhotoViewController *photoViewController = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];<br /> Photo *tophForView = [appDelegate objectInListAtIndex:indexPath.row];<br /> photoViewController.title=tophForView.title;<br /> photoViewController.toph=tophForView;<br /> [[self navigationController] pushViewController:photoViewController animated:YES];<br /> [photoViewController release];<br /><br />}
Listing 2
- (void)loadView {<br /> <br /> [self.toph setImgWide];//requette "asynchrone" pour mettre l'image ds mon objet photo<br /> <br /> UIImageView *theImageView = [[UIImageView alloc] initWithImage: self.toph.imgWide];//exception levée ici<br /> [theImageView release];<br /> <br />}
Merci d'avance pour l'attention que vous porterez à mon problème.
Cordialement,
Guittonews.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
• Tu as une une UITableView contenant des adresses de photos.
• Tu veux que la sélection d'un item provoque un changement de vue, gérée par un PhotoViewController, contenant entre autre la photo.
• La photo est dans une UIImageView créée pour l'occasion.
Si je regardes ton listing 2, l'imageView est créée, mais n'est pas ajoutée à la vue courante. Il faut quelque part un [self.view addSubview:theImageView]
Remarques
• Que se passe-t-il si cet item est sélectionné plusieurs fois : le PhotoViewController est recréé ainsi que l'imageView d'après ton code ...
• Pourquoi avoir choisi loadView plutôt que viewDidLoad qui permet de profiter entièrement de la configuration faite dans le nib ?
Tu as bien saisi le fonctionnement de l'application.
Je me suis fais la remarque aussi en ce qui concerne le addSubview cependant je ne sais pas ou le placé...à la fin du loadView j'imagine...ce qui me donnerai ceci pour loadView:
Le comportement s'avère un peu différent, le programme "tourne en boucle " dans loadView (jimagine que la vue n'arrivant pas l'appel de la méthode est rééxécuté).
A priori tu as raison le PhotoViewController ainsi que l'image view seraient recréé à chaque fois, pas très optimisé je te l'accorde et je suis ouvert à tout conseil ou suggestion pour améliorer ce point là .
Pour le loadView VS viewDidLoad, et bien dans les deux cas j'ai une exception de levé...sauf que dans un cas il n'y a que du code que j'ai l'impression de mieux comprendre par rapport à ce qu'il se passe dans l'interface builder...cependant je n'ai aucun a priori sur une des deux méthodes et avec quelques explications et/ou ressource "bitables" sur le sujet je prend avec les nib
Merci de ton attention.
Guittonews (dit guitton ou la guit')
C'est parce que la vue associé ton contrôleur n'est pas créée. Dès lors à chaque demande la vue self.view , il redemande à ce que tu la crées, .. par loadview.
Je fais un essai (j'utilise viewDidLoad d'habitude puisque je fais un xib associé) et je te le présente ( mais je te conseille d'utiliser ici viewDidLoad, ou même rien du tout, car tu peux ici faire tout ce qui suit dans IB).
• Créer un photoController pour chaque image, c'est de la gabegie. Crée un seul photoController, contenant une image view (définie dans IB), et change l'image présentée par l'image view à chaque changement d'item. Tu peux aussi remplacer l'UIImageView par une UIWebView puisque je crois comprendre que les références des images sont des URL.
• Pour ne créer qu'une seule fois un objet, on peut prendre le schéma
if(!photoController) {
 photoController =[[PhotoController alloc] initWithNibName:@... bundle:nil];
}
Ce n'est pas logique de faire loadview avec un xib prêt dans IB.
loadView c'est pour tout faire à la main, y compris la vue principale
viewDidLoad, c'est pour compléter un xib contenant une ébauche de la vue.
N'oublie pas que dans le nib :
• Le File's Owner a pour classe PhotoController
• L'outlet view de ce File's Owner doit être connectée à la vue principale de ce nib.
Dans UITableViewController :
Dans PhotoViewController :
J'ai une question dans la continuité de ce que je suis en train de faire : ici j'ai donc utilisé une webView pour afficher mon image. Cela m'offre t'elle les mêmes propriété qu'avec une ImageView? (je pense en terme de zoom notamment, et peut être à d'autres choses auxquelles je ne pense pas mais qui pourraient être intéressantes par rapport au fait que je n'affiche qu'une image).
Encore merci de m'avoir aider.
Cordialement.
Antoine.
C'est possible, si le photoViewController est défini à l'intérieur de ta méthode et/ou si tu as fait un release.
Il faudra vérifier quand même avec Instruments > leaks que tu n'as pas de fuite mémoire
Pas les mêmes possibilités mais le zoom doit marcher.
Vraiment sympa de m'avoir aider, je viendrais poster la solution finale si cela peut aider quelqu'un.
Antoine.