NSTableView Les données ne s'affichent pourtant elles sont là  !

sisopetronsisopetron Membre
mars 2012 modifié dans API AppKit #1
Bonjour à  tous,



Je continue mon apprentissage et mon exploration du cocoa et je tombe sur un problème que je ne peux expliquer. Je veux afficher dans ma NSTableView les données d'un NSMutableArray. Mais il n'y a que la première colonne qui s'affiche. Pouratnt les données sont bien là  : si je sélectionne et mets le pointeur dans une cellule alors la valeur s'affiche. Je fais un tab et la valeur de la cellule suivante s'affiche tandis que la valeur de la cellule dans laquelle je me trouvais s'efface.



Avez-vous une idée d'où pourrait provenir ce comportement ?



Merci de votre aide.



Didier

Réponses

  • Bonjour Didier,



    Peux-tu nous envoyer ton code ? Afin qu'on analyse plus précisément où se trouve le problème.



    Merci.
  • Merci Julier de t'intéresser à  mon problème.



    Je résume : je télécharge sur internet un fichier des tirages du loto. Comme c'est un csv, je le parse pour le placer dans ma tableview via une classe perso.
    <br />
    @interface Drawings : NSObject {   <br />
       <br />
        NSString *drawingDate;<br />
        NSString *drawing1;<br />
        NSString *drawing2;<br />
        NSString *drawing3;<br />
        NSString *drawing4;<br />
        NSString *drawing5;<br />
        NSString *drawing6;<br />
        NSString *extraBall;   <br />
    }<br />
    @property (nonatomic, retain) NSString *drawingDate;<br />
    @property (nonatomic, retain) NSString *drawing1;<br />
    @property (nonatomic, retain) NSString *drawing2;<br />
    @property (nonatomic, retain) NSString *drawing3;<br />
    @property (nonatomic, retain) NSString *drawing4;<br />
    @property (nonatomic, retain) NSString *drawing5;<br />
    @property (nonatomic, retain) NSString *drawing6;<br />
    @property (nonatomic, retain) NSString *extraBall;<br />
    @end
    


    Ma fonction pour parser le fichier :
    <br />
    - (NSMutableArray *)parseCSV:(NSString *)myString {<br />
        NSUInteger debutLigne, debutLigneSuivante, finLigne, finString;<br />
        NSMutableArray *list;<br />
       <br />
        debutLigneSuivante = 0;<br />
        list = [NSMutableArray array];<br />
        finString = [myString length];   <br />
        do {<br />
    	    [myString getLineStart:&amp;debutLigne<br />
    							   end:&amp;debutLigneSuivante<br />
    					   contentsEnd:&amp;finLigne<br />
    						  forRange:NSMakeRange(debutLigneSuivante, 1)];<br />
    	    [list addObject:[myString substringWithRange:NSMakeRange(debutLigne, finLigne-debutLigne)]];<br />
        } while (debutLigneSuivante &lt; finString);   <br />
    	<br />
        NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:[list count]];   <br />
        int i;   <br />
        for (i=0; i&lt;[list count]; i++) {<br />
    	    NSString *line = [list objectAtIndex:i];<br />
    	    NSArray *keys = [[NSArray alloc] initWithObjects:@&quot;drawingDate&quot;, @&quot;drawing1&quot;, @&quot;drawing2&quot;, @&quot;drawing3&quot;, @&quot;drawing4&quot;,@&quot;drawing5&quot;, @&quot;drawing6&quot;, @&quot;extraBall&quot;, nil];          <br />
    	    NSMutableDictionary *items = [[NSMutableDictionary alloc] initWithObjects:[line componentsSeparatedByString:@&quot;;&quot;] forKeys:keys];<br />
    	    [array addObject:items];<br />
    	    [items release];<br />
        }<br />
        [array removeObjectAtIndex:0];<br />
    	 return array;   <br />
    }
    


    Méthode que j'appelle ainsi :
    <br />
    drawingsList = [[self parseCSV:result] retain];<br />
    [tvDrawings reloadData];
    


    result étant le NSString du fichier récupéré sur internet et drawingList le NSMutableArray contenant les tirages.



    Pour être exhaustif, voici aussi les deux methodes datasource de ma tableview:
    <br />
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {   <br />
        return [drawingsList count];<br />
    }<br />
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {   <br />
        NSString *identifier = [tableColumn identifier];   <br />
        Drawings *drawings = [drawingsList objectAtIndex:row];<br />
        return [drawings valueForKey:identifier];   <br />
    }<br />
    
  • mpergandmpergand Membre
    mars 2012 modifié #4
    On doit pouvoir faire plus simple:
    <br />
    NSString* csvStr=@&quot;04/02/1978,6,17,30,31,35,37,15\n&quot;<br />
    &quot;11/02/1978,1, 5,8,17,23,28,14\n&quot;<br />
    &quot;18/02/1978,3,5,6,8,17,18,10&quot;;<br />
    <br />
    -(NSMutableArray*) parseCSV:(NSString*) csvStr<br />
    {<br />
    NSMutableArray* csvArray=[[NSMutableArray alloc] init];<br />
    NSArray* lines=[csvStr componentsSeparatedByString:@&quot;\n&quot;];<br />
    int i,count=[lines count];<br />
    for(i=0;i&lt;count;i++)<br />
      {<br />
      NSString* line=[lines objectAtIndex:i];<br />
      NSArray* items=[line componentsSeparatedByString:@&quot;,&quot;];<br />
      [csvArray addObject:items];<br />
      }<br />
    <br />
    return csvArray;  // tableau de tableaux de 8 valeurs<br />
    }<br />
    -(void) awakeFromNib<br />
    {<br />
    csvArray=[self parseCSV:csvStr];<br />
    <br />
    <br />
    [oTableView setDataSource:self];<br />
    [oTableView reloadData];<br />
    }<br />
    - (int)numberOfRowsInTableView:(NSTableView *)aTableView<br />
    {<br />
    return [csvArray count];;<br />
    }<br />
    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex<br />
    {<br />
    <br />
    /* on peut faire ça à  condition de ne pas déplacer les colonnes &#33; */<br />
    int colIndex=[[aTableView tableColumns] indexOfObject:aTableColumn];  // numero de la colonne<br />
    NSArray* items=[csvArray objectAtIndex:rowIndex];<br />
    <br />
    return [items objectAtIndex:colIndex];<br />
    <br />
    }<br />
    <br />
    
  • Merci mpergand, ta façon de faire est évidemment très intéressante et m'ouvre de nouvelles perspectives que je vais examiner à  fond.



    Cependant, ça ne répond pas à  ma question. Et j'aimerais quand même bien savoir où se trouve mon erreur, ne fusse que pour apprendre à  ne pas la reproduire.
  • LexxisLexxis Membre
    mars 2012 modifié #6
    A tout hasard, est-tu sous Lion ? La NSTableView que tu utilise ne serait-elle pas du type "View-based" plutôt que "Cell-based" ?

    Tu peux éventuellement inclure ton projet si tu veux comme ça nous pourrons vérifier de visu.
  • Ok problème résolu : j'ai supprimé la TableView de mon xib puis je l'ai recréée et ça fonctionne maintenant. Je suppose donc qu'une "fausse manoeuvre" dans les propriétés de la table a provoqué le problème.



    Merci de votre aide à  tous.
Connectez-vous ou Inscrivez-vous pour répondre.