Tableaux, NSNumber, int, balayage...

muqaddarmuqaddar Administrateur
14:07 modifié dans API AppKit #1
Salut la compagnie,

J'ai plein de petites questions.  ;D

J'ai balayé un tableau de cette façon :

<br />  int indexAug;<br />     Person *currentAug;<br />       <br />  for (indexAug=0; indexAug&lt;[peopleToRemove count]; indexAug++) {<br />        &nbsp; &nbsp; currentAug = [peopleToRemove objectAtIndex:indexAug];<br />       &nbsp; &nbsp; [currentAug takeValue:@&quot;0&quot; forKey:@&quot;expectedRaise&quot;];<br />    &nbsp; &nbsp; [self updateChangeCount:NSChangeDone];<br />      &nbsp; &nbsp; [self updateUI];  <br />  }<br />


Tout ce petit monde marche.
En regardant plus haut ds mon code, j'ai un NSEnumerator de cette façon :

<br />&nbsp; &nbsp; Person *currentPerson;<br />&nbsp; &nbsp; NSNumber *index;<br />&nbsp; &nbsp; int choice;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //cr&eacute;er un tableau modifiable lib&eacute;r&eacute; automatiquement<br />&nbsp; &nbsp; NSMutableArray *peopleToRemove = [NSMutableArray array];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //obtenir un enumerateur pour les lignes selectionnes<br />&nbsp; &nbsp; NSEnumerator *e = [tableView selectedRowEnumerator];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; while (index = [e nextObject]) {<br /> currentPerson = [employees objectAtIndex:[index intValue]];<br />       [peopleToRemove addObject:currentPerson];<br />&nbsp; &nbsp; }<br />


La principale différence, c'est bien s?r la méthode nextObject pour balayer l'énumérateur mais aussi le type NSnumber choisi pour l'index de l'énumérateur, alors que moi j'ai pris du int pour l'index de mon tableau.
Pourquoi cette différence ? Pourquoi pas un int pour l'index de l'énumérateur ?

Autre question : ma façon de faire pour mettre à jour une colonne de ma tableView avec l'identifier sur une multiselection est elle la meilleure ? Y a t-il une méthode qui évite un while, puisque mon tableau (peopleToRemove) a été construit avec l'énumérateur auparavant, et que je le repasse dans un while, alors que par exemple cette méthode :
    [employees removeObjectsInArray:peopleToRemove];
permet de supprimer tous les enregistrements de peopleToRemove.

Suis-je clair ?  :P

Réponses

  • 14:07 modifié #2
    Pour la première question il est certain que tu ne peux pas utiliser un int car l'objet renvoyé par la méthode nextObject est... un objet, enfin un pointeur sur un objet et absolument pas un int. L'objet pointé étant le suivant dans le tableau à chaque nouvelle invocation de nextObject. On peut ainsi faire une énumération des éléments d'un Array sans avoir recours à un index et en restant entièrement sur une logique objet.

    Voila comment j'aurais codé moi :
    <br />† † id unObjet;<br />† † int choice;<br />† † <br />† † //cr&eacute;er un tableau modifiable lib&eacute;r&eacute; automatiquement<br />† † NSMutableArray *peopleToRemove = [NSMutableArray array];<br />† † <br />† † //obtenir un enumerateur pour les lignes selectionnes<br />† † NSEnumerator *e = [tableView selectedRowEnumerator];<br />† † <br />† † while (unObjet = [e nextObject]) <br />&nbsp;  {<br />&nbsp; &nbsp; &nbsp; [peopleToRemove addObject: unObjet];<br />† † }<br />
    


    Si j'ai bien tout compris ça fait exactement ce que faisait ton code mais en beaucoup plus simple à écrire.
  • 14:07 modifié #3
    Bien que ton code ne soit pas faux, ça ne fait pas la même chose que le sien, car tu ne mets dans peopleToRemove que des NSNumber, alors que lui veut les personnes elle-mêmes.

    La réponse à ton autre question est à ma connaissance non, pas moyen d'éviter le while...
  • 14:07 modifié #4
    Alors plusieurs points, effectivement j'ai zappé un peu vite le [employees objectAtIndex], l'habitude de justement ne pas avoir à utiliser d'index avec des NSEnumeraror.

    Maintenant j'ai regardé la doc, et la méthode selectedRowEnumerator] est deprecated dans Mac OS X 10.3 et ne doit donc plus être utilisée, sauf que la méthode donnée en remplacement (selectedRowIndexes) ne renvoie pas un NSEnumerator mais un NSIndexSet objet que je ne connais pas.

    Donc voila pour le moment je n'ai pas le temps de chercher plus loin.
  • muqaddarmuqaddar Administrateur
    14:07 modifié #5
    Arldon : ok pour le while qu'on ne peut éviter.

    aLittleWoodElfe : j'avais vu ds la doc ce "deprecated", c-a-d qu'ils déconseillent de l'utiliser, même si ça marche encore ?
    Ok pour le reste.

    Merci à tous les deux.
  • 14:07 modifié #6
    dans 1088002632:

    aLittleWoodElfe : j'avais vu ds la doc ce "deprecated", c-a-d qu'ils déconseillent de l'utiliser, même si ça marche encore ?


    Exactement, ça marche encore mais dans le futur (mais je serais bien en peine de te donner une échéance) ça ne marchera plus. Problème si tu veux être compatible avec 10.2.* tu dois l'utiliser car la méthode donnée en remplacement n'existe que depuis 10.3 (éventuellement tu peux tester à l'exécution la version de Mac OS X et utiliser l'une des deux méthodes en fonction, ou bien coder avec la méthode deprecated pour le moment mais mettre en commentaire le code avec la nouvelle méthode pour pouvoir changer rapidement le jour où ça cassera.

  • muqaddarmuqaddar Administrateur
    14:07 modifié #7
    Ok, ok, je note tout cela.
    Je chercherai comment on teste la version de MacOs X.
  • 14:07 modifié #8
    Voila comment je la teste moi :
    <br />if( floor(NSAppKitVersionNumber) &lt;= NSAppKitVersionNumber10_2 )<br />
    


    Et dans le if tu mets le code spécifique à Mac OS X 10.2.*
  • muqaddarmuqaddar Administrateur
    14:07 modifié #9
    Super ! Merci pour l'info !
  • odjauodjau Membre
    14:07 modifié #10
    dans 1088000246:

    Maintenant j'ai regard&eacute; la doc, et la m&eacute;thode selectedRowEnumerator] est deprecated dans Mac OS X 10.3 et ne doit donc plus &ecirc;tre utilis&eacute;e, sauf que la m&eacute;thode donn&eacute;e en remplacement (selectedRowIndexes) ne renvoie pas un NSEnumerator mais un NSIndexSet objet que je ne connais pas.


    J'ai essayer d'utiliser la méthode préconisée pour Mac OSX.3 et j'aimerais bien votre avis (ça fonctionne évdement, mais qu'est ce que ça vaut d'un point de vu "finesse de programmation" ??? merci de pas être trop sévère  :-\)

    voilà  mon code
    <br />NSIndexSet *indexes = [tableView selectedRowIndexes];<br />int index = [indexes lastIndex];<br />while (index == [indexes indexLessThanOrEqualToIndex:index])<br />     {<br /> [monTableau removeObjectAtIndex:index];<br />   index = [indexes indexLessThanIndex:index];<br />       }<br />...<br />
    


    Au début j'avais essayé d'utiliser la fonction - (unsigned int)getIndexes:(unsigned int *)indexBuffer maxCount:(unsigned int)bufferSize inIndexRange:(NSRangePointer)range, mais je n'ai pas du tout réussi à  l'implémenter  :'(
    Est-il possible de l'utiliser pour récupérer les index à  supprimer ou dois-je revoir mon anglais au plus vite :-\

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