Un peu d'aide sur NSSearchField et searchString "vide"
uocram
Membre
Hello!
Je veux utiliser un NSSearchField pour filtrer une selection dans une NSTableColumn bindée avec un NSArrayController :
1. j'ai subclassé un NSArrayController
2. j'ai overrridé arrangeObjects (conformément à la méthode proposée par ADC) ce qui donne :
La suite procède au filtre et met à jour la table, ce qui fonctionne bien chez moi.
Mon problème est que lorsque l'utilisateur supprime la chaine de recherche en effaçant totalement le contenu du NSSearchField, la searchString n'est pas egale à nil (en tout cas on n'abouti pas au test ci-dessus) et la table n'affiche rien alors que je souhaiterais avoir la totalité des enregistrements (comme il n'y a plus de filtre).
Comment faire pour obtenir un affichage de la totalité de la table?
Je veux utiliser un NSSearchField pour filtrer une selection dans une NSTableColumn bindée avec un NSArrayController :
1. j'ai subclassé un NSArrayController
2. j'ai overrridé arrangeObjects (conformément à la méthode proposée par ADC) ce qui donne :
- (NSArray *)arrangedObjects:(NSArray *)objects
{
if (searchString == nil)
{
return [super arrangeObjects:objects];
}
etc?
La suite procède au filtre et met à jour la table, ce qui fonctionne bien chez moi.
Mon problème est que lorsque l'utilisateur supprime la chaine de recherche en effaçant totalement le contenu du NSSearchField, la searchString n'est pas egale à nil (en tout cas on n'abouti pas au test ci-dessus) et la table n'affiche rien alors que je souhaiterais avoir la totalité des enregistrements (comme il n'y a plus de filtre).
Comment faire pour obtenir un affichage de la totalité de la table?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cela marche impec.
Je bidouille une appli de gestion de médias avec quasi que du binding dont je joins une vue (PNG 56Ko).
[Fichier joint supprimé par l'administrateur]
J'ai appris l'autre jour qu'il ne faut jamais faire un test avec length == 0 pour verifier qu'une chaà®ne est vide, car certains caractères unicodes peuvent rendre ce test non pertinent. La solution est de faire un test isEqualToString:@""
Surprenant, hein ? Pourtant l'info vient des mailing lists d'Apple, je suppose que c'est sérieux
http://lists.apple.com/archives/cocoa-dev/2004/Jul/msg00166.html
+
Chacha
Donc oui, le mieux est (searchString==nil || [searchString isEqualToString:@""])
Oui mais quand la valeur de retour n'est pas un objet, il ne faut pas trop se fier au résultat. Pour les types intégraux (int, BOOL), ça doit effectivement passer (nil == 0 == FAUX, je pense), mais y'a apparemment des problèmes pour les float.
Cf le thread: http://www.objective-cocoa.org/forum/index.php?topic=1218
Je n'ai jamais vraiment regardé ce qui se passait, mais dans le doute, j'ai pris pour habitude ne pas envoyer de message à un objet potentiellement nil si la valeur de retour n'est pas elle-même un objet.
+
Chacha
j'obtiens une alerte du compilateur :
An uncaught exception was raised
2005-10-19 09:00:39.722 MediaBase[5626] *** -[NSCFString rangeOfString:options:range:]: nil argument
et avec :
cela ne fonctionne pas : le NSSearchField vide ne vérifie pas ce test.
Seul, le test :
donne le bon comportement...
(searchString est une NSString, instance variable initialisée à @"" dans l'init de la subclass du NSArrayController)
Que renvoie exactement un NSSearchField validé à vide avec [sender stringValue] ?
En fait ce double test fonctionne sans alerte du compilateur et correctement pour la recherche.
Cela fait donc 2 solutions, la 2e plus "propre" que l'autre.
Cela dit, que renvoie donc le [sender stringValue] avec le NSSearchField "vide"?
En tout cas merci à tous.