Encore mon problème d'array qui se dupliquent

2»

Réponses

  • VeillardVeillard Membre
    23:11 modifié #32
    OK, je vais voir de ce côté.

    à  l'image de la première page de ton carnet de plongée FFESSM -ancien format-

    La fédé change sans arrêt ses carnets, à  force on ne sait plus ce qui est ancien :)
  • VeillardVeillard Membre
    23:11 modifié #33
    Bon, avant de continuer dans un mauvaise voie, je voulais savoir si je vais dans le droit chemin en écrivant ceci :

    - (void)encodeWithCoder:(NSCoder *)coder<br />{<br />&nbsp; &nbsp; [coder encodeObject:lieu];<br />&nbsp; &nbsp; [coder encodeObject:site];<br />&nbsp; &nbsp; [coder encodeValueOfObjCType:@encode(int) at:&amp;profondeur];<br />}<br /><br />- (id)initWithCoder:(NSCoder *)coder<br />{<br />&nbsp; &nbsp; if (self = [super init]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [self setLieu:[coder decodeObject]];<br />&nbsp; &nbsp; &nbsp; &nbsp; [self setSite:[coder decodeObject]];<br />&nbsp; &nbsp; &nbsp; &nbsp; [coder decodeValueOfObjCType:@encode(int) at:&amp;profondeur];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br />
    


    et

    - (NSData *)dataRepresentationOfType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [plongeesTableView deselectAll:nil];<br />&nbsp; &nbsp; return [NSArchiver archivedDataWithRootObject:tableauDesPlongees];<br />}<br /><br />- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [tableauDesPlongees release];<br />&nbsp; &nbsp; tableauDesPlongees = [[NSUnarchiver unarchiveObjectWithData:data] retain];<br /><br />&nbsp; &nbsp; return YES;<br />}<br />
    


    Pour l'enregistrement de mes fichiers...
  • VeillardVeillard Membre
    23:11 modifié #34
    J'ai un autre problème d'incompatibilité avec le nouveau code que je suis en train d'écrire.

    Dans ma tableView, je voudrais rajouter des unités à  mes valeurs, avant j'utilisais :

    <br />- (id)tableView:(NSTableView *)myTableView objectValueForTableColumn:(NSTableColumn *)myTableColumn row:(int)rowIndex<br />{<br />	id theRecord, theValue;<br /><br />	theRecord = [tableauDesPlongees objectAtIndex:rowIndex];<br />	theValue = [theRecord objectForKey:[myTableColumn identifier]];<br /><br />	if ([[myTableColumn identifier] isEqual:@&quot;profondeur&quot;])<br />	{<br />		theValue = [[theValue mutableCopy] autorelease];<br />		[theValue appendString:@&quot; m&quot;];<br />	}<br />return theValue;<br />}<br />
    


    J'ai essayé ceci :

    <br />- (id)tableView:(NSTableView *)myTableView objectValueForTableColumn:(NSTableColumn *)myTableColumn row:(int)rowIndex<br />{<br />	NSString *identifier = [myTableColumn identifier];<br />	<br />	Plongee *plongee = [tableauDesPlongees objectAtIndex:rowIndex];<br />	<br />	if ([[myTableColumn identifier] isEqual:@&quot;profondeur&quot;])<br />	{<br />		NSMutableString *temp = [plongee valueForKey:identifier];<br />		[temp appendString:@&quot; m&quot;];<br />		[plongee valueForKey:identifier] = temp;<br />	}<br />	return [plongee valueForKey:identifier];<br />}<br />
    


    et j'ai l'erreur suivante : "invalid lvalue assignment"  :(
  • BruBru Membre
    23:11 modifié #35
    dans 1104948361:

    J'ai un autre problème d'incompatibilité avec le nouveau code que je suis en train d'écrire.


    Tu te compliques bien la vie pour ajouter l'unité "m" à  ta valeur avant de l'envoyer à  la NSTableView...

    <br />- (id)tableView:(NSTableView *)myTableView objectValueForTableColumn:(NSTableColumn *)myTableColumn row:(int)rowIndex<br />{<br />    Plongee *plongee = [tableauDesPlongees objectAtIndex:rowIndex];    <br />    if ([[myTableColumn identifier] isEqual:@&quot;profondeur&quot;])<br />    {<br />        return [NSString stringWithFormat:@&quot;%@ m&quot;, [plongee valueForKey:identifier]];<br />&nbsp; &nbsp; }<br />    return @&quot;&quot;;<br />}<br />
    


    .
  • VeillardVeillard Membre
    23:11 modifié #36
    Quelle puissance  !  o:) Je me complique la vie pour rien ! Merci Bru  :brule:
    J'ai énormémént dégraissé mon code  :)

    Au fait, si ce n'est pas trop abuser, est-ce que j'ai écrit pour enregistrer mes données c'est OK ? tromaran.gif
  • Eddy58Eddy58 Membre
    23:11 modifié #37
    Tes méthodes d'enregistrement ont l'air correct, mais j'aurais plutôt écrit :

    <br />    [coder encodeObject:[self lieu]];<br />    [coder encodeObject:[self site]];<br />
    


    pour respecter la logique accesseurs. :)
  • VeillardVeillard Membre
    23:11 modifié #38
    Bon, j'arrive à  enregistrer mon carnet après avoir importé l'ancien, je peux éditer les profils non sans quelques petits problèmes (on verra ça plus tard).  :P

    Juste une question sur les méthodes utilisées par Bru :
    Quand on écrit la méthode suivante :

    <br />- (void)addPlongee<br />{<br />&nbsp; &nbsp; Plongee *plongee;<br />	<br />&nbsp; &nbsp; plongee = [[Plongee alloc] init];<br />&nbsp; &nbsp; ....<br />}<br />
    


    on peut l'appeler par :

    <br />[self addPlongee];<br />
    


    Bru a écrit la méthode ci-dessus d'une manière abrégée :

    <br />- (void)addPlongee:(Plongee *)plongee<br />{<br />...<br />}<br />
    


    Comment fait-on pour l'appeler ? ???

  • muqaddarmuqaddar Administrateur
    23:11 modifié #39
    bein tu donnes un argument en plus non ?

    [self addPlongee: maPlongeeDeLaMortQuiTueOuBruEstResteEnBasAvecLesDauphins];
    

  • VeillardVeillard Membre
    23:11 modifié #40
    Oui, bien sûr, on le trouve où cet argument, comment il est initialisé ?

    - (IBAction)addPlongeeAction:(id)sender<br />{<br />&nbsp; &nbsp; [self addPlongee:argument];<br />&nbsp; &nbsp; ...<br />}<br /><br /><br />- (void)addPlongee:(Plongee *)plongee<br />{<br />&nbsp; &nbsp; plongee = [[Plongee alloc] init];<br /><br />&nbsp; &nbsp; ...<br />	<br />&nbsp; &nbsp; [tableauDesPlongees addObject:plongee];<br /><br />&nbsp; &nbsp; [plongee release];<br />}<br />
    


    Mon carnet (tableauDesPlongees) est modifié dans "addPlongee". Il y a un truc que je pige pas  :(
  • BruBru Membre
    23:11 modifié #41
    dans 1105035137:

    Oui, bien sûr, on le trouve où cet argument, comment il est initialisé ?


    Tu te débrouilles très bien.

    Normalement, tu as créé une fenêtre dans laquelle l'utilisateur saisit sa plongée (il y a donc des NSTextFields et surtout y'a le bouton de validation "Ajouter la plongée" à  la fin)

    L'action de ce bouton déclenchera ce genre de code :
    <br />- (IBAction)addPlongeeAction:(id)sender<br />{<br />    PLONGEE *nouvellePlongee;<br /><br />    // étape 1 : on créé un nouvel objet PLONGEE<br />    nouvellePlongee=[[PLONGEE alloc] init];<br /><br />    // étape 2 : on transfère les valeurs saisies dans la fenêtre vers l&#39;objet PLONGEE<br />    [nouvellePlongee setLieu:[textfield_lieu stringValue]];<br />    [nouvellePlongee setProfondeur:[textfield_profondeur floatValue]];<br />    [nouvellePlongee setProfil:nil];<br /><br />    // étape 3 : quand tout est rempli, on ajoute notre plongée au carnet<br />    [carnetDeFlavouille addPlongee:nouvellePlongee];<br /><br />    // étape 4 : on a plus besoin de la plongée nouvellement créée, alors on la release<br />    [nouvellePlongee release];<br /><br />    // c&#39;est fini !<br />}<br />
    


    Ce type de code est un classique de la programmation objet.


    PS pour Oxitan : note que ma variable nouvellePlongee ne m'est utile que dans la méthode ci dessus, alors je la déclare localement à  cette méthode (et non dans le .h).

    .
  • ClicCoolClicCool Membre
    23:11 modifié #42
    dans 1105033626:
    <br />[self addPlongee: maPlongeeDeLaMortQuiTueOuBruEstResteEnBasAvecLesDauphins];
    



    Mort de Rire  :o
    Tu prend Bru pour le héro du grand bleu ?

    Moi j'aurais plutot pensé à  Enzo pour lui, mais t'as p'tet raison il est plein de surprise ce gars ;)
  • VeillardVeillard Membre
    23:11 modifié #43
    Normalement, tu as créé une fenêtre dans laquelle l'utilisateur saisit sa plongée (il y a donc des NSTextFields et surtout y'a le bouton de validation "Ajouter la plongée" à  la fin)


    Tout à  fait !

    Par contre, si je veux insérer une plongée, je créée une nouvelle méthode. Pour cette méthode, j'espère qu'il ne faut pas retaper :
    &nbsp; &nbsp; [nouvellePlongee setLieu:[textfield_lieu stringValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfondeur:[textfield_profondeur floatValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfil:nil];<br />.......<br />
    

    Pour mes 64 variables d'instance  :o
  • ClicCoolClicCool Membre
    23:11 modifié #44
    Salut Favouille ;)

    Si tu as tant de variables associées à  un textField, pourquoi, à  défault de bindings, ne pas mettre des tags à  tes texts fields afin de renseignégner tes variables au travers d'une boucle de lecture du tag 0 au tag 63 pour renseigner tes tes variables rangées dans un tableau ordonné de 0 à  63 ? ;)

    Au chargement du nib, tu mets une référence aux textFields dans un Array dans la position de leur tag.

    Dès qu'on clique sur "valder" (ou qq chose comme ça) tu lance la boucle de 0 à  63 attribuant le contenu du TextField de tag n à  la variable en position n (ou avec la @key en position n) .../...
  • VeillardVeillard Membre
    23:11 modifié #45
    Hello ClicCool

    En réalité, c'est plus compliqué que ça. J'ai une soixantaine de variables qui correspondent à  des TextField, PopUpButton, Switch, Sliders etc... Donc je pensais qu'on pouvait faire qq chose du style :

    - (IBAction)addPlongee:(id)sender<br />{<br />&nbsp; &nbsp;  [self creerPlongee];<br />...<br />}<br /><br />- (IBAction)updatePlongee:(id)sender<br />{<br />&nbsp; &nbsp; &nbsp;  .....<br />	[carnet replaceObjectAtIndex:index withObject:[creerPlongee]];<br />}<br /><br />- (IBAction)indertPlongee:(id)sender<br />{<br />&nbsp; &nbsp; &nbsp; &nbsp; .....<br />	[carnet insertObject:[self creerPlongee] atIndex:index];<br />}<br /><br />- (id)creePlongee<br />{<br />&nbsp; &nbsp; [nouvellePlongee setLieu:[textfield_lieu stringValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfondeur:[textfield_profondeur floatValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfil:nil];<br />}<br />
    
  • Eddy58Eddy58 Membre
    23:11 modifié #46
    Tu as tout a fait compris le principe qu'il faut appliquer Favouille... 
  • VeillardVeillard Membre
    23:11 modifié #47
    Le problème, c'est que j'ai le message d'erreur suivant :  :'(
    -[NSCFArray addObject:]: attempt to insert nil


    - (IBAction)addPlongee:(id)sender<br />{<br />&nbsp; &nbsp; [carnet addObject:[self creerPlongee]];<br />&nbsp; &nbsp; ...<br />}<br /><br />- (IBAction)updatePlongee:(id)sender<br />{<br />&nbsp; &nbsp; ...<br />&nbsp; &nbsp; [carnet replaceObjectAtIndex:index withObject:[creerPlongee]];<br />}<br /><br />- (void)creerPlongee<br />{<br />&nbsp; &nbsp; PLONGEE *nouvellePlongee;<br /><br />&nbsp; &nbsp; [nouvellePlongee setLieu:[textfield_lieu stringValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfondeur:[textfield_profondeur floatValue]];<br />&nbsp; &nbsp; [nouvellePlongee setProfil:nil];<br />&nbsp; &nbsp; ...<br />&nbsp; &nbsp; [nouvellePlongee release];<br />}
    
  • ClicCoolClicCool Membre
    23:11 modifié #48
    dans 1105086752:

    Le problème, c'est que j'ai le message d'erreur suivant :  :'(
    -[NSCFArray addObject:]: attempt to insert nil


    - (IBAction)addPlongee:(id)sender<br />{<br />&nbsp; &nbsp; [carnet addObject:[self creerPlongee]];<br />&nbsp; &nbsp; ...<br />}<br />
    



    Est tu bien sur de ne pas avoir oublié de terminer ta méthode creerPlongee par un return plongeeCree; avec un objet plongeeCree valide ?
  • BaardeBaarde Membre
    janvier 2005 modifié #49
    Pour que l'objet [self creerPlongee] existe, il faudrait que la méthode crerPlongee renvoie un objet. Or ce n'est pas la cas.
    Il faudrait écrire
    + (id)creerPlongee<br />{<br />    PLONGEE *nouvellePlongee = [[PLONGEE alloc] init];<br /><br />    [nouvellePlongee setLieu:[textfield_lieu stringValue]];<br />    [nouvellePlongee setProfondeur:[textfield_profondeur floatValue]];<br />    [nouvellePlongee setProfil:nil];<br />    ...<br />    return [nouvellePlongee autorelease];<br />}
    
  • VeillardVeillard Membre
    23:11 modifié #50
    OK merci, je vais essayer ce soir à  la maison  :P
  • VeillardVeillard Membre
    23:11 modifié #51
    Bon, ça marche avec :

    - (IBAction)addPlongeeAction:(id)sender<br />{<br />&nbsp; &nbsp; [carnet addObject:[self creerPlongee]];<br />&nbsp; &nbsp; ....<br />}<br /><br /><br />- (PLONGEE *)creePlongee<br />{<br />&nbsp; &nbsp; ...<br />}<br />
    
  • VeillardVeillard Membre
    23:11 modifié #52
    Ca y est !
    Mon problème d'array qui se duplique n'en est plus un.  :brule:
    Tout est rentré dans l'ordre ce soir et il ne me reste quelques réglages à  faire pour retrouver l'état initial  8)

    Merci à  tous et à  Bru en particulier pour son aide  :)
Connectez-vous ou Inscrivez-vous pour répondre.