Ajout d'une image à  un tableview cell

cecile92cecile92 Membre
11:26 modifié dans API UIKit #1
Bonsoir

Je suis débutante sur iphone SDK et cela fait plusieurs soir que je prend la tête sur une question basique : comment ajouter une image à  une UITableviewcell >:(

J'ai bien compris qu'en utilsant un UITableViewCellStyleDefault, l'image est optionnelle mais impossible de l'ajouter. J'ai retrouvé plusieurs ex de code mais à  chaque fois, il y ades variables qui manque....

Voici mon code pour déclarer le type UITableViewCell:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

cell.textLabel.text = [[self.menuList objectAtIndex:indexPath.row] objectForKey:kTitleKey];
return cell;

}

Et la déclaration d'une des lignes de l'UITableViewCell dans lequel j'ai essayé d'ajouter une image (un des ex d'apple en l'occurence :
Introduction *introduction = [[Introduction alloc]
  initWithNibName:@Introduction bundle:nil];
[self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:
  NSLocalizedString(@Introduction, @";"), kTitleKey,
/* cell.imageView.image = [UIImage imageNamed:@Gas_24.png];
*/
  introduction, kViewControllerKey,
  nil]];
[introduction release];


Bref, si quelqu'un peut aider une pauvre débutante ::)

Merci

Réponses

  • muqaddarmuqaddar Administrateur
    11:26 modifié #2
    Bonsoir et bienvenue.

    C'est bien cette ligne là  qu'il te faut :

    cell.imageView.image = [UIImage imageNamed:@"Gas_24.png"];
    


    Bien entendu, il faut que l'image en question soit associée au projet dans les ressources.
  • CeetixCeetix Membre
    11:26 modifié #3
    *essaie de mettre ton code entre balises dédiées au code, pour plus de lisibilité.

    Sinon pour ma part j'utilise d'abord un UITableViewCell pour personnaliser de A à  Z ma cell (image, texte, positionnement du tout) qu'ensuite j'utilise dans mon tableview.
  • cecile92cecile92 Membre
    juillet 2010 modifié #4
    Bonsoir

    J'avais déjà  essayé et j'ai un message d'erreur :'(


    [tt]
    Introduction *introduction = [[Introduction alloc]
      initWithNibName:@Introduction bundle:nil];
    [self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:
      NSLocalizedString(@Introduction, @";"), kTitleKey,
    cell.imageView.image = [UIImage imageNamed:@icon.png];
                                                      error: 'cell' undeclared (first use in this function)
                                                      error: expected ']' before ';' token


      introduction, kViewControllerKey,
      nil]];
    [introduction release];
    [/tt]


    Une idee?

    merci
  • CeetixCeetix Membre
    11:26 modifié #5
    Oh nom de Di** !!
    C'est bourré de fautes :(
    As-tu lu la doc Apple un peu ? Et as-tu déjà  programmer avant de te mettre sur l'iPhone ? :)
    Non parce que là  je vois même pas ce que tu veux faire.
  • AliGatorAliGator Membre, Modérateur
    11:26 modifié #6
    Soit pas si vache Ceetix...
    Bon ceci dit oui cecile92, si tu as mis ton code [tt]cell.imageView.image = ...[/tt] à  cet endroit dans ce code, c'est soit que tu n'as pas réfléchi, soit que tu n'as rien compris quant à  la syntaxe de l'Objective-C... mais là  tu as mis une ligne de code en plein milieu d'une instruction de code même pas terminée... c'est quand même un peu n'importe quoi.

    C'est comme si tu avais une phrase "J'apprend à  faire une appli iPhone", qu'on te demandais de rajouter l'info "ceci est mon premier programme", et que tu modifiais ta phrase en "J'apprend à  ceci est mon premier programme faire une appli iPhone", ce qui n'a plus aucun sens.
  • CeetixCeetix Membre
    11:26 modifié #7
    dans 1278701513:
    c'est quand même un peu n'importe quoi.

    [font=verdana, helvetica, sans-serif][/size][/font]
    [font=verdana, helvetica, sans-serif]Et je suis vache [size=small] :P [/size][/size][/font]
  • cecile92cecile92 Membre
    11:26 modifié #8
    OK ca marche >:(

    Lorsque je n'aurais rien à  vous demander, je m'adresserais à  vous

    Là  je suis rhabillée pour l'hiver, çà  tombe bien, on est en pleine canicule

    Certes je démarre et avec des forums comme celui ci, je risque effectivement de ne pas aller plus loin. :'(

    Si un de vous deux veux bien me faire une réponse claire sans augmenter ma garde robe je suis preneuse sinon....
  • CeetixCeetix Membre
    11:26 modifié #9
    Oh faut pas se braquer comme ça, c'est bon enfant et surtout on essaie de savoir où tu en es niveau développement.
    Ton erreur : error: 'cell' undeclared (first use in this function)
    C'est simplement parce que tu n'as aucune variable cell définie dans ton code.
    Ensuite tu marques la fin d'une ligne de code par un ";" juste après "icon.png]" or tu es encore addObject.

    Sinon dans un forum comme celui-ci on va se présenter aux autres ici ;)
  • cecile92cecile92 Membre
    11:26 modifié #10
    Bon bon, je vois que j'ai manqué à  toutes les règles mais je débute aussi sur les forums :o

    Bon, voilà  où j'en suis,
      soit j'arrive à  mettre la même image dans toutes les lignes (pas la peine de me dire que c'est normal vu où je mets ma ligne de code
      soit j'ai cette foutu erreur et je ne vois pas comment déclarer cette "cell"

    Voilà  le code qui me permet de mettre la même image partout..
    
    

    Introduction *introduction = [[Introduction alloc]
      initWithNibName:@Introduction bundle:nil];
    [self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@Introduction, @";"), kTitleKey,
      introduction, kViewControllerKey,
      nil]];

    [introduction release];


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil)
    {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    cell.textLabel.text = [[self.menuList objectAtIndex:indexPath.row] objectForKey:kTitleKey];
    cell.imageView.image = [UIImage imageNamed:@icon.png];
    return cell;

    }
    
    



  • CeetixCeetix Membre
    11:26 modifié #11
    C'est normal que tu affiches toujours la même image :

    cell.imageView.image = [UIImage imageNamed:@"icon.png"];
    
    ici pour chaque row de ton indexPath (pour chaque cell en gros) tu affiches icon.png .
  • cecile92cecile92 Membre
    11:26 modifié #12
    certes je suis débutante mais ca je l'avais vu
    Bon, voilà  où j'en suis,
      soit j'arrive à  mettre la même image dans toutes les lignes (pas la peine de me dire que c'est normal vu où je mets ma ligne de code


    Donc question subsidiaire : ou dois je mettre cette foutu ligne de code dans mon code pour y arriver ....Ou alors tu veux me faire tourner en bourrique toute la soirée. c'est le bizzutage?
  • CeetixCeetix Membre
    11:26 modifié #13
    Bah tu veux faire quoi ? Ajouter une image différente pour chaque ligne c'est bien ça ? Histoire que ça soit clair.
  • cecile92cecile92 Membre
    11:26 modifié #14
    Oui, je souhaite mettre une image différente pour chaque ligne de mon tableau.
    Merci

  • CeetixCeetix Membre
    juillet 2010 modifié #15
    bon donc loin de moi l'idée de te bizuter mais il va déjà  falloir avoir plusieurs images (icon1.png, icon2.png, etc ...)
    et ensuite dans ton dictionnaire ajouter tes images avec kTitleImage. Ca marche exactement pareil que :

    cell.textLabel.text = [[self.menuList objectAtIndex:indexPath.row] objectForKey:kTitleKey];[/code]<br />sauf que là  :<br /><br />[code]cell.imageView.image = [UIImage imageNamed:[[self.menuList objectAtIndex:indexPath.row] objectForKey:kTitleImage]];
    
  • cecile92cecile92 Membre
    11:26 modifié #16
    Merci pour la ligne


    Celle ci me parait claire o:)

    OK pour mettre autant d'icone que nécessaire ( cela me paraissait clair)

    Par contre j'abuse si je te demande ce que je dois mettre dans une des lignes du tableau :
    
    

    Introduction *introduction = [[Introduction alloc]
      initWithNibName:@Introduction bundle:nil];
    [self.menuList addObject:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@Introduction, @icon.png), kTitleKey,
      introduction, kViewControllerKey,
      nil]];

    [introduction release];
    
    
  • CeetixCeetix Membre
    11:26 modifié #17
    En gros tu dois avoir quoi? Deux tableaux : le premier pour le texte de tes lignes et le second pour tes images. L'usage du dictionnaire est approprié à  ta demande. Quand je regarde ton code je me dis que tu prends la chose un poil à  l'envers.
    Ton menuList est un tableau n'est-ce pas ? Il faut faire ça dans l'autre sens. Un NSDictionary qui contient deux tableaux avec une clef différente ("Image","Texte" par exemple).

    <br />NSArray *tabTexte; <br />NSArray *tabImage;<br />/* Je suppose que tu as rempli tes deux tableaux */<br />NSDictionary *tonDico = [[NSDictionary alloc] initWithObjectsAndKeys:tabTexte,@&quot;Texte&quot;,tabImage,@&quot;Image&quot;,nil];<br />
    

  • cecile92cecile92 Membre
    11:26 modifié #18
    Comme je le signalais, je débute sur cocoa et en fait lorsque je commence qqch de nouveau, j'essaye d'abord de faire qqch de simple pour comprendre le mécanisme puis je complexifie en fonction de ma comprehension

    Donc pour le moment, pas fais de tableau, je voudrais ajouter une image sur une ligne particulièe de ce mon tableview cell

    Je pensais que l'on pouvais la faire de manière simple mais soit j'exprime mal ma demande (ce qui est largement possible....) soit ce n'est pas possible......

    Je voudrais juste ajouter l'image "icon" à  une ligne particulière de mon tableau

    je ne souhiate pas pour le moment faire de tableau de valeur (ou alors je ne comprends pas ton message) car certaines lignes de mon UITableview cell sont juste une UIview tandis que d'autres sont d'autres UITableView.

    Bref, je sais très bien bien que je barbote dans le bac à  sable mais si ta réponse pouvais se mettre à  mon niveau.....

    Merci

  • CeetixCeetix Membre
    11:26 modifié #19
    Ah d'accord eh bien tu vas tester la ligne sur laquelle tu es :

    <br />if(indexPath.row ==&nbsp; 4)<br />{<br />cell.imageView.image = [UIImage imageNamed:@&quot;icon.png&quot;];<br />}<br />
    
  • cecile92cecile92 Membre
    11:26 modifié #20
    <3 <br />
    Yes

    Et en plus, tu dois vraiment admirer ma nullité mais cele me permet de comprendre pas mal de chose

    Merci beaucoup :D
  • CeetixCeetix Membre
    11:26 modifié #21
    T'inquiète, je pensais juste que tu avais quelques bases tout de même. La prog iPhone c'est pas l'idéal pour commencer le soft :)
  • Bonjour,


     


    je ré-ouvre le sujet, en effet j'ai une petite question qui ne devrai pas être trop compliqué pour les Maitres Jedi, j'ai demandé à  Monsieur StackOverF... mais j'ai rien trouvé, anyway, comment modifier la taille de l'imageView sans passer par une custom cell



    let cell = tableView.dequeueReusableCellWithIdentifier("MyReuse", forIndexPath: indexPath) as UITableViewCell

    cell.imageView?.image = UIImage(named: "MyImage.jpg")
    cell.imageView?.image.frame = CGRect(0,0,42,42)
    cell.imageView?.image.bounds = .....

    L'image un bien la mais elle occupe toute la hauteur de la cell, j'aurai voulu des marges pour rendre plus jolie !!!!


     


    Merci 


  • DrakenDraken Membre
    octobre 2015 modifié #23

    Pour modifier la taille (et la position) d'une imageView il suffit de modifier sa frame :



    imageView.frame = CGRectMake(2, 2, 40, 40)

    Dans le cas d'une imageView optionnelle encapsulée dans une cellule :



    cell.imageView?.frame = CGRectMake(2, 2, 40, 40)


    Pour avoir des marges, tu peux calculer la frame à  partir de la taille de la cellule. Un truc du genre (code non testé) :



    let size = cell.bounds.size
    let marge:CGFloat = 2.0
    let frame = CGRectMake(marge, marge, size.width-2*marge, size.height-2*marge)
  • AliGatorAliGator Membre, Modérateur

    Dans le cas d'une imageView optionnelle encapsulée dans une cellule :


    cell.imageView?.frame = CGRectMake(2, 2, 40, 40)

    Ce n'est pas forcément vrai, car la UITableViewCell par défaut se charge de repositionner la UIImageView "imageView" et les UILabels "textLabel" et "detailedTextLabel" elle-même avant de s'afficher (la UITableViewCell par défaut a en effet du code pour caler les labels à  gauche s'il n'y a pas d'image, ou les caler à  droite de l'ImageView si elle a une image, etc).

    Donc dans le cas particulier où tu utilises UITableViewCell et ses imageView, textLabel et detailTextLabel par défaut, vu qu'elle va repositionner ces éléments avant de s'afficher, y'a des chances que ça ne serve à  rien de modifier la frame vu qu'elle va être re-changée plus tard.

    Non vraiment, c'est quand même bien plus simple de faire une sous-classe de UITableViewCell dès le moment où tu veux la customiser ne serait-ce qu'un minimum. C'est pensé pour de toute façon.
  • Effectivement, je n'ai jamais essayé avec une UITableViewCell par défaut. Merci de me prévenir du piège. 


  • OK, c'est bien ce qui me semblais, il ne prenais pas mes modification en compte, bon allons pour une sous classe de UITableViewCell


     


    Merci beaucoup.


  • Hey hey autre question !!! dites moi, est il possible de mettre des auto-layouts sur la taille de font des textes dans les UITableViewCell qui ce changerait en fonction d'un iPad ou iPhone, ou alors faut absolument faire une condition avec détection de iDevice ????


  • Autre question .. nouveau topic !


  • oki !!! Je voulais pas trop polluer et vu qu'on reste sur des UITableViewCell même si ce n'est pas sur les images !!! sorry sorry 


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