Calcul d'age + affichage dans une NSTableView
Akis
Membre
Bonjour,
Je réalise une petite application permettant de récupérer les contacts de l'Address Book et de calculer leur age.
Voici la façon donc je calcule l'age. (birthday étant une variable contenant la date de naissance d'une personne. Egalement de type NSCalendarDate).
Cela fonctionne parfaitement, il calcule l'age comme il faut. La variable "age" contient bien l'age car si je vérifie son contenu ou que je l'affiche dans la console, le rendu est correct.
Cet age, je l'insère après dans une NSTableView. Cela fonctionne à nouveau parfaitement SAUF pour une personne ayant une date de naissance en 1927.
L'age est bien calculé mais le rendu dans la NSTableView n'est pas correct. Il m'affiche ceci (lorsque l'application ne plante pas d'ailleurs) :
Et à première vue, cela refuse d'afficher la bonne valeur uniquement pour cette année, si je change en 1928 ou 1926, l'age est correctement affiché dans la vue.
Quelqu'un aurait une idée du problème ?
Merci d'avance.
Je réalise une petite application permettant de récupérer les contacts de l'Address Book et de calculer leur age.
Voici la façon donc je calcule l'age. (birthday étant une variable contenant la date de naissance d'une personne. Egalement de type NSCalendarDate).
NSCalendarDate *today = [NSCalendarDate date];<br /> int years;<br /> [today years:&years months:NULL days:NULL hours:NULL minutes:NULL seconds:NULL sinceDate:birthday];<br /> <br /> age = [NSString stringWithFormat:@"%d", years];
Cela fonctionne parfaitement, il calcule l'age comme il faut. La variable "age" contient bien l'age car si je vérifie son contenu ou que je l'affiche dans la console, le rendu est correct.
Cet age, je l'insère après dans une NSTableView. Cela fonctionne à nouveau parfaitement SAUF pour une personne ayant une date de naissance en 1927.
L'age est bien calculé mais le rendu dans la NSTableView n'est pas correct. Il m'affiche ceci (lorsque l'application ne plante pas d'ailleurs) :
Et à première vue, cela refuse d'afficher la bonne valeur uniquement pour cette année, si je change en 1928 ou 1926, l'age est correctement affiché dans la vue.
Quelqu'un aurait une idée du problème ?
Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ou alors tu as converti ton âge, entier, d'une mauvaise façon pour l'afficher dans ta tableView, ce qui vait que pour les petites valeurs ça va mais pour les plus grandes ça fait n'importe quoi.
Tu pourrais nous mettre le code de tes méthodes implémentant le protocole NSTableDataSource ? Qu'on voit comment tu récupères ton age de type int et comment tu le convertit en chaà®ne pour le renvoyer à la DataSource ? A moins que tu ne le convertisses pas ?...
Un arrosage mémoire c'est quand on écrit dans de la mémoire qui n'a pas été allouée ou qui ne nous appartient pas...
ça donne des résultats aléatoires en général mais ça peut aboutir à un crash de l'application (particulièrement quand on écrit sur la pile d'exécution du programme).
Souvent, quand on a des crashs aléatoires pour les mêmes manipulation, c'est ça.
Il faut alors voir au débugueur où ça a planté et ce qu'on a fait juste avant... (le problème c'est que ça peut crasher longtemps après !)
Pour ce qui est du code qui calcule l'age, il est dans le premier message. Et en effet, c'est un entier que je converti en string pour l'afficher dans ma NSTableView.
Ce qui est étrange, c'est que si j'ai une année en 1928 ou 1926, j'aurais bien l'affichage qu'il faut (80 ou 82 ans). J'ai le soucis qu'avec l'année 1927, du moins, j'ai l'impression. Donc ça n'est pas un problème de "valeur trop grande".
Merci de l'info.
Le soucis aussi, c'est que j'avais bien évidemment tester le debuggeur. Ce qui fait qu'il inscrit bien l'age comme il faut dans la variable. (De plus, j'ai doublement vérifier en l'affichant dans la console avec un NSlog(). Ce qui l'affiche bien également).
A première vue, je ne sais pas ce que fait mon NSTableView mais il aime pas trop le chiffre 81
Et je viens encore de vérifier, après avoir créer mon NSArray avec mes éléments, j'ai vérifier le contenu de chaque entrée dans le debuggeur et tout est correct. Chaque variable affichée dans le NSTableView est bien remplie comme il faut.
Donc à première vue, c'est quand je met le tableau dans mon NSTableView ?
J'utilise un NSArrayController pour ce faire avec la méthode suivante :
Tu utilises un array controller et tu gères la Table View en Data Source? en Binding ? en CoreData ?
Le principe est de dissocier le modèle du controller en mettant ce modèle (=les données) dans une NSMutableArray.
Tu places ce NSMutableArray dans l'une de tes classes principales, et tu fais les connexions via le NSArrayController entre la table view et le modèle.
Ainsi, je pourrai tester les deux.
ADC Home > Reference Library > Reference > Cocoa > User Experience > NSTableDataSource Protocol Reference >
J'ai essayé de l'implémenter pour mon petit programme mais ça coince quelque part.
Niveau code, j'ai lu qu'il fallait implémenter 3 méthodes, chose que j'ai fais, correctement je pense. :
(model correspond à mon NSArray)
Ensuite, j'ai toujours mon algo qui me rempli mon NSArray :
Du côté d'IB, j'ai bien ma class qui référence le datasource et delegate. Les deux vers la TableView.
Et du côté de la table view, mes colonnes sont identifiées par les string : name, birthday et age.
Je n'ai pas l'impression d'avoir fait des erreurs, pourtant cela ne fonctionne pas.
Lorsque je lance mon appli (avec des NSLog un peu partout), je m'aperçois qu'au lancement de l'appli, numberOfRowsInTableView me renvoie 0. Après seulement est générer mon model mais l'appli semble s'arrêter là ...
Merci
en utilisant une NSMutableArray, tu allégerais (au niveau fonctionnement) en [model addObject:person];
[tableView reloadData] doit être fait (en tout ou partie) après tout changement sur le modèle, afin que la vue en prenne connaissance.
Mon count me renvoie maintenant une valeur incrémentée à chaque fois. Donc c'est bon.
Par contre, j'ai l'impression que les 2 autres méthodes ne sont pas correct car elles ne sont "jamais" appelée. J'ai des NSLog dans chacune d'elle et je n'ai rien dans la console.
Remarque: si j'utilise un NSMutableArray, il me renvoie cette erreur : [NSCFArray insertObject:atIndex:]: mutating method sent to immutable object
//edit: cette erreur là : "objc[10594]: FREED(id): message release sent to freed object=0x1c4a00", cela peut signifier quoi ?
ça c'est un problème dans la déclaration ou création
déclaration
NSMutableArray * model;
initialisation par exemple juste après que le nib ait été chargé
-(void) awakeFromNib {
model=[[NSMutableArray alloc] init];
...
}
C'est un problème de retain : la création d'un objet n'assure pas une durée de vie permanente ... peut-être as-tu utilisé
model=[NSMutableArray array]; qui n'assure pas un retainCount >=1
Là cela vient peut-être des erreurs précédentes.
Remarque : la méthode setObjectValue sert uniquement lors d'un changement provoqué par l'utilisateur dans la table view.
Concernant l'erreur de Freed(id) ... , j'ai du retirer tous mes releases pour qu'ils ne l'affichent plus
Il y a les release que l'on peut voir dans le code de ce post et j'engloble tout mon code d'un NSAutoreleasePool.
J'avais même pendant un moment mis dans ma boucle un [pool drain] comme j'avais vu, je ne sais plus où, que cela était utile dans de le faire dans une boucle.
Sinon merci pour tout, ça fonctionne et je n'ai plus mon "bug" du fameux chiffre 81 qu'il ne voulait pas inscrire sans bugger
//edit : Et je viens de tester avec les bindings aussi et ça fonctionne maintenant, je devais avoir une erreur quelque part que j'avais pas vu ^^ Cependant, je vais garder ma solution avec le datasource car ça me permet de faire plus de chose je trouve.