NSEnumerator -> exercice 2 chap. 5

CrazyJoCrazyJo Membre
18:23 modifié dans API AppKit #1
Bonjour à  tous,

J'ai deux problèmes avec les deux exercices qui sont à  la page 122-124 de Cocoa par la pratique.
Pour le premier où il faut que le bouton deleteButton soit desactivé lorsqu'aucune ligne est sélectionnée j'y suis presque mais quelque chose cloche.
- (void)tableViewSelectionDidChange:(NSNotification *)n{<br />	int row = [tableView selectedRow];<br />	if(row = 1){<br />		[deleteButton setEnabled:YES];} <br />	else {<br />		[deleteButton setEnabled:NO];}<br />}

la première fois que l'app se lance le bouton est bien grisé et se dégrise bien lorsque l'on sélectionne une ligne mais ensuite dès que je clique ailleurs (pas sur une ligne) le bouton reste toujours dégrisé... Je ne comprends pas pourquoi ca fait ça ... ca avait l'air pas méchant comme méthode...

Pour mon deuxième problème (un peu plus complexe) qui est en fait l'ex 2 du même chapitre, j'ai des soucis avec NSEnumerator. Le but est de pouvoir supprimer plusieurs lignes sélectionnées. En fait je ne comprends pas trop comme tout ca fonctionne et que fait ce enumerator et cette boucle while. Si quelqu'un pourrait m'expliquer concrètement comment toutes ces variables , cette boucle et ce enumerator fonctionnent .. je pense qu'en comprenant déjà  mieux comment tout ca travail je pourrais faire fonctionner cette méthode correctement . Pour le moment sa ne marche qu'avec qu'une ligne sélectionnée si y'en a plus xCode dit :
2008-02-03 12:55:40.252 EmployeAugmentation[958:10b] *** -[NSCFArray objectAtIndex:]: index (2) beyond bounds (2)
2008-02-03 12:55:40.987 EmployeAugmentation[958:10b] *** -[NSCFArray objectAtIndex:]: index (2) beyond bounds (2)

- (IBAction)deleteEmployee:(id)sender{<br />	int row = [tableView selectedRow];<br />	NSNumber *anIndex;<br />	int aRow;<br />	NSEnumerator *e = [tableView selectedRowEnumerator];<br />	// une ligne a t elle était séléctionnée<br />	if(row != -1){<br />		while (anIndex = [e nextObject]) {<br />			aRow = [anIndex intValue];<br />			[employees removeObjectAtIndex:aRow];}<br />		// supprimer la/les personne/s sélectionnée/s<br />		[self updateUI];<br />	} else {<br />		NSBeep();<br />	}<br />}	<br />

voila merci

Réponses

  • schlumschlum Membre
    18:23 modifié #2
    "if(row = 1)" est... toujours vrai  :o
    (et en plus, affecte 1 à  "row", mais ça c'est subsidiaire  ;D)

    On appelle ça une erreur de débutant en C  :P
  • schlumschlum Membre
    février 2008 modifié #3
    La deuxième erreur est une erreur d'algorithmie classique aussi..

    Tu as une liste et plusieurs indices à  supprimer, il faut commencer par la fin, sinon si tu supprimes un indice au début, les suivants sont décalés et tous les autres indices à  supprimer deviennent faux.

    Réponse à  ton problème avec les diverses solutions ici :
    http://www.objective-cocoa.org/forum/index.php/topic,2414.html
  • 18:23 modifié #4
    dans 1202040257:

    "if(row = 1)" est... toujours vrai  :o


    Et c'est là  qu'on sort le manuel des bonnes habitudes, dans ce genre de cas, il est recommandé d'écrire la variable à  droite du = et non à  gauche:

    [tt]if ( 1 == row )[/tt] est correct
    [tt]if ( 1 = row )[/tt] génère une erreur à  la compil.
  • CrazyJoCrazyJo Membre
    18:23 modifié #5
    Merci mais tout de même bizarre que je n'ai pas trouvé ce sujet lors de la recherche...
    A part ça y' a beaucoup de chose qui changent comme ça dans cocoa par la pratique ? parce que là  cette histoire d'effacer plusieurs lignes est nettement plus simple à  comprendre avec cette nouvelle méthode...
    Ah et aussi pour finir NSEnumerator sert quoi en général , c'est quand qu'on l'utilise ?
  • psychoh13psychoh13 Mothership Developer Membre
    18:23 modifié #6
    Les NSEnumerator on les utilise pour énumérer les objets d'une collection. Par exemple, si tu veux récupérer toutes les clés d'un NSDictionary, pour pouvoir les analyser par exemple, tu vas devoir utiliser un énumérateur.

    Sinon, Cocoa par la pratique date de Mac OS X 10.2, donc forcément il y a pas mal de choses qui ont changé, mais le principe est là . Le principal c'est que toi, après, tu fasses des recherches plus poussées au lieu de te conformer uniquement au livre.
    Il faut surtout apprendre à  utiliser la documentation et être capable de l'utiliser correctement.
  • schlumschlum Membre
    18:23 modifié #7
    Les techniques enseignées dans le livre sont toujours valable à  99% (je ne crois pas qu'il utilise des méthodes devenues "deprecated" depuis).
    Après, les 3 grandes versions de système qui ont été faites depuis ont apporté des solutions plus simples à  certains problèmes, ce qui n'empêche qu'il est bon de connaà®tre les anciennes techniques.
  • psychoh13psychoh13 Mothership Developer Membre
    18:23 modifié #8
    Bah justement la méthode utilisée dans le livre dans ce cas-ci selectedRowEnumerator est déconseillée. (deprecated) :D
  • schlumschlum Membre
    18:23 modifié #9
    Effectivement 
    Ceci-dit, d'une elle fonctionne toujours, et de deux quand on lit sa doc, il est précisé quelle méthode utiliser à  la place  ;)
Connectez-vous ou Inscrivez-vous pour répondre.