Comment faire une recherche avec un NSPredicate
Bonjour à tous,
voilà j'ai un petit problème :
je fais une recherche avec
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@SELF contains[cd] %@",searchText];
sauf que dans ce cas la, ca fonctionne si j'ai seulement des strings dans mon arraylist.
Maintenant, j'ai une arraylist qui contient que des contacts .:
[contactSearch addObject:monContact];
et je voudrais faire une recherche sur les noms . Sauf que quand je mets SELF.name , cela ne fonctionne pas . J'ai une exception .
NSUnknownKeyException', reason: '[<Contact 0xa0b4db0> valueForUndefinedKey:
Voici ma classe Contact :
@interface Contact : NSObject
@property NSString * name;
Que mettre dans ma condition de mon predicate? Qu'est ce que j'ai oublié ?
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
bizarre... car ceci fonctionne chez moi:
Lorsque j'ajoute
à la place de
cela marche parfaitement avec
. Dois-je ajouter une propriété ou quoi que ce soit dans ma classe Contact ? Je suis un peu perdu. De plus, c'est un mutablearray que j'ai et non un mutabledictionary
Mais bug toujours avec name
Plusieurs remarques avant de te répondre
1) [monContact get_Name]]; ---> on dirait du Java !!! Si tu ne suis pas les règles de nommage de Objective-C, comment veux-tu utiliser les patterns d'Apple ? Quand tu fais [NSPredicate predicateWithFormat:@name contains[cd] %@",@Colas]; tout est basé sur le fait qu'il y a une méthode -(NSString*)name dans ta classe.
Ta méthode get_Name devrait s'appeler -(NSString*)name
2) Quand tu utilises une @property NSString*, il est conseillé de mettre l'option copy : @property(copy) NSString*
Ton problème pourrait bien venir du 1)
Bonne remarque colas2 . Je viens de changer cela en name. C'est juste du test ^^.
Donc dans mon NSPredicate j'ai :
Mais ca plante toujours avec la meme erreur : '
Pourtant j'ai bien mis "name" partout, dans ma classe et dans le predicate ... j'ai mis (copy) aussi ...
L'erreur indique qu'il essaye d'appliquer la méthode -(id)copy sur un object de type Contact.
D'après mon expérience (OSX mais il se peut que ce soit pareil pour iOS), cela peut venir d'un problème sur un xib, où tu ferais référence à un objet de type Contact.
Astuce aussi dans ton cas, tu peux régler le debugguer pour qu'il t'amène en mode debug sur la ligne qui plante : cf. les images jointes
D'apres les breakpoint, c'est ma ligne
qui planterai .
Alors tu peux essayer de cliquer sur ce bouton, cf. image
Avant de lancer ton filtre, fais un NSLog(@%@", contactSearch) ;
Mon nslog :
Et si tu fais NSLog(@%@", [contactSearch valueForKey:@name]) ; ?
lorsque je met cela j'ai
pourtant j'ai bien ma méthode name
Le problème ne vient donc pas de NSPredicate, mais de la @property qui est mal synthétisée.
Pour déclarer une @property (une @property est un couple de méthodes, associée à un nom, une méthode pour le getter et une méthode pour le setter) Il faut juste mettre dans ton .h
Cela va automatiquement créer deux méthodes (elles ne sont pas écrites et tu ne les vois pas parce qu'elles sont créées lors de la compilation), -(NSString*)name et -(void)setName:(NSString*)aName.
Au passage, c'est d'ailleurs ces méthodes qui sont appelées lors que tu utilises la notation pointée :
Et (si tu as une version suffisamment récente de xcode) : tu n'as rien à mettre dans le .m
Tu n'as pas non plus à déclarer de variable name.
J'ai mis la propriété et cela fonctionne toujours pas. A mon avis, je ne comprends pas bien le concept. Donc , en fait mon but étant de faire une recherche sur mes contacts, et avec ce résultat, cliquer sur une contact et qui m'ouvre une autre vue avec les différents détails du contact(telephone,mobile etc... ).
Donc dans ma méthode
j'ai
. Elle fonctionne très bien lorsque mon arrayslist contient seulement des nsstring. Maintenant, lorsque je fais
ça plante. j'ai bien mis dans .h de ma classe Contact la propriété. Aucun code n'a été généré . Est-ce bien dans la classe Contact que je dois mettre cela, et non dans ma viewcontroller.h ? Je pense que j'oublie une étape importante ...
ça plante où exactement ?
à [contactSearch addObject:monContact] ?
ou ailleurs ? Quel est le message d'erreur ?
Si tu joins ton projet, je pourrai te dire où est l'erreur.
Je te remercie colas2 , mais je viens juste de résoudre mon problème. Je te remercie pour ton aide précieuse . Voici mon code :
Enfait, tout fonctionnait parfaitement, mais lors de mon affichage dans ma tableview , je faisais :
au lieu de :