UITableViewController et parsing

Bonjour à  tous,

depuis quelques jours je me bloque sur la récupération d'une variable que j'ai obtenue par parsing json et je souhaite l'utiliser vers une UITableViewController.

au niveau de controllerView qui la vue principale:
<br />
homeViewController *home= [[homeViewController alloc] initWithNibName:@&quot;homeViewController&quot; bundle:[NSBundle mainBundle]];//tableviewController<br />
home.userID=[NSString stringWithFormat:@&quot;%@&quot;, [parserResults objectForKey:@&quot;id&quot;]];//userID que j&#39;ai identifié au niveau de homeviewController.h<br />
NSLog(@&quot;user id for home:%@&quot;,home.userID);<br />
[self presentModalViewController:home animated:YES];<br />


au niveau de homeViewController.m:
<br />
- (void)viewDidLoad<br />
{<br />
  <br />
    maListe = [[NSMutableArray alloc] init];<br />
    NSString* iduser=[[NSString alloc]init];<br />
  <br />
    NSString *application=@&quot;monurl&amp;&amp;id=&quot;;<br />
    NSLog(@&quot;home&quot;);<br />
	 iduser=_userID;<br />
	 NSLog(@&quot;userid:%@&quot;,iduser);//j&#39;ai recuperer le bon userID<br />
	 NSString *chaine3;<br />
	 chaine3 = [NSString stringWithFormat:@&quot;%@%@&quot;,application,iduser];<br />
	 //NSURL *url = [NSURL URLWithString: chaine3];<br />
	 NSLog(@&quot;url application:%@&quot;,chaine3);//le bon URL<br />
 <br />
    SBJsonParser *parser = [[SBJsonParser alloc] init];<br />
   <br />
   <br />
   NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:<br />
						    chaine3]];<br />
  <br />
    NSData *response = [NSURLConnection<br />
					    sendSynchronousRequest:request<br />
					    returningResponse:nil error:nil];<br />
   <br />
    NSString *json_string = [[NSString alloc]initWithData:response encoding:NSUTF8StringEncoding];<br />
 <br />
   <br />
    NSArray *app = [parser objectWithString:json_string error:nil];<br />
   <br />
    NSLog(@&quot;count = %d&quot;, [app count]);<br />
  <br />
    [maListe addObjectsFromArray:app];<br />
    NSLog(@&quot;la liste:%@&quot;,maListe);//j&#39;ai recupere la bonne liste<br />
    NSLog(@&quot;%d&quot;,[maListe count]);<br />
	  [super viewDidLoad];<br />
   <br />
}<br />


mais pour UITableViewCell:
<br />
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath<br />
{<br />
    <br />
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@&quot;MyIdentifier&quot;]; <br />
    NSString *cellValue = [NSString stringWithFormat:@&quot;%@&quot;, [[maListe objectAtIndex:indexPath.row] objectForKey:@&quot;ApplicationName&quot;]];<br />
    NSString *cellV = [[[maListe objectAtIndex:indexPath.row] objectForKey:@&quot;build&quot;]objectForKey:@&quot;BuildName&quot; ];<br />
    NSString *image=[[maListe objectAtIndex:indexPath.row] objectForKey:@&quot;pathIcon&quot;];<br />
    NSString *URLim=[NSString stringWithFormat:@&quot;%@%@&quot;,@&quot;http://&quot;,image];<br />
    NSURL *uneImage = [NSURL URLWithString: URLim];<br />
    UIImage *img = [UIImage imageWithData: [NSData dataWithContentsOfURL: uneImage]];<br />
    cell.textLabel.text=cellValue;<br />
    cell.detailTextLabel.text=cellV;<br />
    cell.imageView.image = img;<br />
    return cell;<br />
   <br />
}<br />


Apres l'execution j'obtient:
<br />
Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:6061<br />
2012-05-21 14:12:38.059 jihedBetaappli[3792:f803] *** Terminating app due to uncaught exception &#39;NSInternalInconsistencyException&#39;, reason: &#39;UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:&#39;<br />


je ne sais pourquoi ça genere une erreur malgrés dans l'affichage de NSLog j'ai la liste correcte.

Est ce que vous avez une idée SVP?
Mots clés:

Réponses

  • KixxxKixxx Membre
    mai 2012 modifié #2
    Bonjour,



    Qu'avez-vous mis dans les méthodes

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section ?



    Avez-vous lié le datasource et le delegate ?
  • Bonjour,merci de m'avoir répondu
    <br />
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section<br />
    {<br />
        return [maListe count];<br />
    }<br />
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {<br />
        return 1;<br />
    }<br />
    


    au niveau de UITableViewCell
    <br />
    NSString *cellValue = [NSString stringWithFormat:@&quot;%@&quot;, [[maListe objectAtIndex:indexPath.row] objectForKey:@&quot;ApplicationName&quot;]];<br />
        NSLog(@&quot;cellVallue:%@&quot;,cellValue);//m&#39;affiche le resultat exacte mais l&#39;erreur persiste<br />
    
  • KixxxKixxx Membre
    Rajoute :



    if (cell == nil){

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@MyIdentifier] autorelease];

    }



    après :



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@MyIdentifier];





    En gros, tu veux ré-utiliser une cellule que tu n'as jamais instanciée auparavant !
  • Merci pour ton aide image/smile.png' class='bbc_emoticon' alt=':)' /> ,

    ça marche mais au niveau des cellules j'ai perdu la liason vers une autre tableview qui est la liste des versions de chaque application ainsi que UINavigationcontroller!!
  • KixxxKixxx Membre
    Je ne vois pas trop ce que tu veux faire.

    Tu veux, après un clic sur une cellule, pousser ton UINavigationController vers un autre contrôleur qui contient une autre tableView ?
  • AliGatorAliGator Membre, Modérateur
    En même temps si tu rajoutes les lignes indiquées par Kixxx mais sans comprendre pourquoi il faut les rajouter ou ce qu'elles font, ou en particulier si tu n'as pas compris ou intégré le principe de recyclage des cellules d'une UITableView, commence par te documenter là  dessus (il y a tout un Programming Guide complet de plusieurs pages dédié à  ça dans la doc Apple) car c'est un concept clé et primordial (surtout si tu veux avoir un scroll fluide et pas risquer de laguer ou d'exploser ton utilisation mémoire de ton appli)
  • oui, au niveau de chaque cellule avant de relier la premiere vue avec recup de la variable ça marche en utilisant:
    <br />
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{<br />
        if([[segue identifier] isEqualToString:@&quot;detailSegue&quot;])<br />
        {<br />
    	    NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];<br />
    	    NSString *nomapp=[[NSString alloc]init];<br />
    	    nomapp=[NSString stringWithFormat:@&quot;%@&quot;, [[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;ApplicationName&quot;]];<br />
    	    NSString *BuildControllerNom= [NSString stringWithFormat:@&quot;%@ %@&quot;,@&quot;Build&quot;,nomapp];<br />
    	   <br />
    	    BuildViewController *dvc = [segue destinationViewController];<br />
    	    dvc.navigationItem.title=BuildControllerNom;<br />
    	    NSString *date=[NSString stringWithFormat:@&quot;%@ / %@ / %@&quot;, [[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;day&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;month&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;year&quot;]];<br />
    	   <br />
    	    NSString *dateC=[NSString stringWithFormat:@&quot;%@ / %@ / %@ à  %@h:%@min:%@sec&quot;, [[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;day&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;month&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;year&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;hour&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;minute&quot;],[[[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadDateBuild&quot; ] objectForKey:@&quot;second&quot;]];<br />
    	   <br />
    	    NSString *URlUpload=[NSString stringWithFormat:@&quot;%@&quot;, [[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;UploadBuild&quot; ]];<br />
    	   <br />
    	    NSURL *uploadB=[NSURL URLWithString:URlUpload];<br />
    	   <br />
    	    NSString *n_build = [NSString stringWithFormat:@&quot;%@&quot;, [[[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;build&quot;]objectForKey:@&quot;BuildName&quot; ]];<br />
    	   <br />
    	    NSString *URlimage=[NSString stringWithFormat:@&quot;%@&quot;, [[maListe objectAtIndex:selectedIndex] objectForKey:@&quot;pathIcon&quot;]];<br />
    	   <br />
    	    NSURL *image=[NSURL URLWithString:URlimage];<br />
    	   <br />
    	    dvc.texteAAfficher =n_build;<br />
    	    dvc.texteAAfficherDate=date;<br />
    	    dvc.texteAAfficherDateC=dateC;<br />
    	    dvc.UploadB=uploadB;<br />
    	    dvc.Image=URlimage;<br />
        }<br />
    


    j'ai recupere toute les infos et je les ai mis dans une autre tableView.Mais avec l'utilisation de l'id de l'utilisateur que j'ai recupere et que je l'ai parsé pour avoir ces applications ça degenere
  • 'AliGator' a écrit:


    En même temps si tu rajoutes les lignes indiquées par Kixxx mais sans comprendre pourquoi il faut les rajouter ou ce qu'elles font, ou en particulier si tu n'as pas compris ou intégré le principe de recyclage des cellules d'une UITableView, commence par te documenter là  dessus (il y a tout un Programming Guide complet de plusieurs pages dédié à  ça dans la doc Apple) car c'est un concept clé et primordial (surtout si tu veux avoir un scroll fluide et pas risquer de laguer ou d'exploser ton utilisation mémoire de ton appli)


    merci pour vos aide, j'ai bien compris le principe que Kixxx m'a indiqué. puisque je suis novice dans la matiere il quelques notions à  revoir .

    Merci en tt cas de m'avoir repondu
  • zoczoc Membre
    mai 2012 modifié #10
    'Kixxx' a écrit:


    Rajoute :



    if (cell == nil){

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@MyIdentifier] autorelease];

    }



    après :



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@MyIdentifier];





    En gros, tu veux ré-utiliser une cellule que tu n'as jamais instanciée auparavant !


    Sauf que le monsieur il utilise les Storyboards (je t'accorde que tu ne pouvais pas le savoir au moment où tu as répondu), et que quand on utilise les storyboards il n'est pas nécessaire d'instancier les cellules de tableviews, le framework le fait automatiquement.



    Par contre, il faut bien s'assurer que dans le storyboard la cellule "modèle" est bien nommée "MyIdentifier".
  • Merci pour votre aide image/smile.png' class='bbc_emoticon' alt=':)' /> mais j'ai suivi les conseil de Aligator et j'ai utilisé:
    <br />
      cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;<br />
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />
    //le code<br />
    }<br />
    


    je n'utilise plus les Stroryboards.Merci à  tous[font=helvetica, arial, sans-serif] [/font]
  • Dsl de vous importuner,

    tout fonctionne sauf la derniere View pour les details: je les creer en utilisant le storyboard avec tous une image de fond .....

    mais quand je sais la cellule elle me l'affiche toute blanche ni les labels, ...
    <br />
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />
        DetailBuildViewController *dbvc = [[DetailBuildViewController alloc] initWithNibName:@&quot;DetailBuildViewController&quot; bundle:nil];<br />
        NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];<br />
      <br />
        dbvc.navigationItem.title=[NSString stringWithFormat:@&quot;%@&quot;, [maListeBuild objectAtIndex:selectedIndex]];<br />
        dbvc.texteAAfficherBuildName = [NSString stringWithFormat:@&quot;%@&quot;, [maListeBuild objectAtIndex:selectedIndex]];<br />
        dbvc.texteAAfficherBuildDate= [NSString stringWithFormat:@&quot;%@&quot;, [maListeBuildDateC objectAtIndex:selectedIndex]];<br />
        dbvc.imageapp=[NSString stringWithFormat:@&quot;%@&quot;, [maListeBuildImage objectAtIndex:selectedIndex]];<br />
       [self.navigationController pushViewController:dbvc animated:YES];<br />
     <br />
    }<br />
    


    viewDidLoad de DetailViewController
    <br />
    - (void)viewDidLoad<br />
    {<br />
        [super viewDidLoad];<br />
        // Do any additional setup after loading the view from its nib.<br />
       <br />
        labelBuildName.text=_texteAAfficherBuildName;<br />
        labelBuildDate.text=_texteAAfficherBuildDate;<br />
        NSString *im=_imageapp;<br />
        NSString *URLim=[NSString stringWithFormat:@&quot;%@%@&quot;,@&quot;http://&quot;,im];<br />
        NSURL *uneImage = [NSURL URLWithString: URLim];<br />
        iconApplication.image = [UIImage imageWithData: [NSData dataWithContentsOfURL: uneImage]];<br />
    }<br />
    


    est ce que vous avez une idée SVP?Merci
  • KixxxKixxx Membre
    'zoc' a écrit:


    Sauf que le monsieur il utilise les Storyboards (je t'accorde que tu ne pouvais pas le savoir au moment où tu as répondu), et que quand on utilise les storyboards il n'est pas nécessaire d'instancier les cellules de tableviews, le framework le fait automatiquement.



    Par contre, il faut bien s'assurer que dans le storyboard la cellule "modèle" est bien nommée "MyIdentifier".




    Ah je ne savais pas, je n'ai encore jamais utilisé storyboard, faudrait que je m'y mette au plus vite ^^ !

    En tout cas, merci pour le tuyau !
  • 'mozaique' a écrit:


    Dsl de vous importuner,

    tout fonctionne sauf la derniere View pour les details: je les creer en utilisant le storyboard avec tous une image de fond .....

    mais quand je sais la cellule elle me l'affiche toute blanche ni les labels, ...
    <br />
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />
    	DetailBuildViewController *dbvc = [[DetailBuildViewController alloc] initWithNibName:@&quot;DetailBuildViewController&quot; bundle:nil];<br />
    	NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];<br />
      <br />
    	dbvc.navigationItem.title=[NSString stringWithFormat:@&quot;%@&quot;, [maListeBuild objectAtIndex:selectedIndex]];<br />
    	dbvc.texteAAfficherBuildName = [NSString stringWithFormat:@&quot;%@&quot;, [maListeBuild objectAtIndex:selectedIndex]];<br />
    	dbvc.texteAAfficherBuildDate= [NSString stringWithFormat:@&quot;%@&quot;, [maListeBuildDateC objectAtIndex:selectedIndex]];<br />
    	dbvc.imageapp=[NSString stringWithFormat:@&quot;%@&quot;, [maListeBuildImage objectAtIndex:selectedIndex]];<br />
       [self.navigationController pushViewController:dbvc animated:YES];<br />
    <br />
    }<br />
    


    viewDidLoad de DetailViewController
    <br />
    - (void)viewDidLoad<br />
    {<br />
    	[super viewDidLoad];<br />
    	// Do any additional setup after loading the view from its nib.<br />
      <br />
    	labelBuildName.text=_texteAAfficherBuildName;<br />
    	labelBuildDate.text=_texteAAfficherBuildDate;<br />
    	NSString *im=_imageapp;<br />
    	NSString *URLim=[NSString stringWithFormat:@&quot;%@%@&quot;,@&quot;http://&quot;,im];<br />
    	NSURL *uneImage = [NSURL URLWithString: URLim];<br />
    	iconApplication.image = [UIImage imageWithData: [NSData dataWithContentsOfURL: uneImage]];<br />
    }<br />
    


    est ce que vous avez une idée SVP?Merci




    Là  malheureusement tu fais au petit bonheur la chance, un coup du storyboard, une autre fois sans. Tu as un gros travail de lecture de doc à  faire. Si tu utilises Storyboard tu as la doc qui va bien et qui explique comment instancier un view controller (avec ou sans segue).

    Tu devrai même trouver des indications dans ce forum ; j'en ai pas mal parlé.
Connectez-vous ou Inscrivez-vous pour répondre.