Problème pour afficher une UIImageView

guittonewsguittonews Membre
04:45 modifié dans API UIKit #1
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
- (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:@&quot;PhotoViewController&quot; 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 &quot;asynchrone&quot; pour mettre l&#39;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.

Réponses

  • Philippe49Philippe49 Membre
    04:45 modifié #2
    Ce que je crois voir :

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

  • guittonewsguittonews Membre
    04:45 modifié #3
    Bonjour philippe et merci d'avoir répondu.

    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:
    [self.toph setImgWide];//requette &quot;asynchrone&quot; pour mettre l&#39;image ds mon objet photo<br />	UIImageView *theImageView = [[UIImageView alloc] initWithImage: self.toph.imgWide];<br />	[self.view addSubview:theImageView];<br />	[theImageView release];
    


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

    Merci de ton attention.
    Guittonews (dit guitton ou la guit')
  • Philippe49Philippe49 Membre
    février 2009 modifié #4
    dans 1234255529:

    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é).

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

    dans 1234255529:

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

    • 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];
    }




    dans 1234255529:

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

    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.
  • Philippe49Philippe49 Membre
    04:45 modifié #5
    dans 1234255529:


    Pour le loadView VS viewDidLoad, et bien dans les deux cas j'ai une exception de levé...


    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.
  • Philippe49Philippe49 Membre
    04:45 modifié #6
    Voilà  avec loadView, cela donnerait un schéma de base :

    Dans UITableViewController :
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />	if(!photoViewController) {<br />		photoViewController=[[PhotoViewController alloc] init];<br />	}<br />	[self.navigationController pushViewController:photoViewController animated:YES];<br />	// charger la webview<br />}
    


    Dans PhotoViewController :
    <br />@interface PhotoViewController : UIViewController &lt;UIWebViewDelegate&gt;{<br />	UIWebView * webView;<br />}<br />@property (nonatomic,retain) IBOutlet 	UIWebView * webView; <br />@end<br />...<br />@implementation PhotoViewController<br />@synthesize webView;<br />- (void)loadView {<br />	self.view=[[UIView alloc]initWithFrame:CGRectMake(0.,0.,320.,480.-20.-44.)];<br />	self.view.backgroundColor=[UIColor redColor];<br />	webView=[[UIWebView alloc] initWithFrame:CGRectInset(self.view.frame,20.,20.)];<br />	[self.view addSubview:webView];<br />	webView.delegate=self;<br />}<br />
    

  • guittonewsguittonews Membre
    04:45 modifié #7
    Merci! Tout marche nickel j'ai pu afficher mes images, gérer la rotation de l'écran etc etc. cependant je n'ai pas réussi à  utiliser ton schema pour ne pas réinstancier une PhotoViewController à  chaque fois...lorsque je fais le test (!photoViewController) il m'indique, à  juste titre, que la variable n'existe pas...

    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.
  • Philippe49Philippe49 Membre
    04:45 modifié #8
    dans 1234280910:

    Merci! Tout marche nickel j'ai pu afficher mes images, gérer la rotation de l'écran etc etc. cependant je n'ai pas réussi à  utiliser ton schema pour ne pas réinstancier une PhotoViewController à  chaque fois...lorsque je fais le test (!photoViewController) il m'indique, à  juste titre, que la variable n'existe pas...

    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 

    dans 1234280910:

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

    Pas les mêmes possibilités mais le zoom doit marcher.
  • guittonewsguittonews Membre
    04:45 modifié #9
    En effet j'ai une fuite de mémoire, je ne libère pas ma photoView (ou ne la réutilise pas suivant la méthode employée) ce qui fait que je gonfle vite...je vais regarder cela de plus près.

    Vraiment sympa de m'avoir aider, je viendrais poster la solution finale si cela peut aider quelqu'un.

    Antoine.
Connectez-vous ou Inscrivez-vous pour répondre.