Un peu d'aide sur NSSearchField et searchString "vide"

uocramuocram Membre
15:51 modifié dans API AppKit #1
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 :

- (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?

Réponses

  • 15:51 modifié #2
    Bien tu peux remplacer searchString==nil par [searchString length]==0...
  • uocramuocram Membre
    15:51 modifié #3
    Merci Supermic :
    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]
  • ChachaChacha Membre
    15:51 modifié #4
    dans 1129663401:

    Bien tu peux remplacer searchString==nil par [searchString length]==0...

    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
  • 15:51 modifié #5
    Oui, c'est ce que j'avais répondu au début, d'ajouter un isEqualToString:@";" puis je me suis dit qu'un [... length] serait plus court et que dans ce cas autant remplacer ==nil...

    Donc oui, le mieux est (searchString==nil || [searchString isEqualToString:@";"])
  • 15:51 modifié #6
    La première partie de ton test ne sert à  rien en fait, car si dans la deuxième partie searchString vaut nil, ce sera d'office une valeur nulle qui sera renvoyée (l'Objective-C permet d'envoyer des messages à  nil).
  • ChachaChacha Membre
    15:51 modifié #7
    dans 1129669141:

    La première partie de ton test ne sert à  rien en fait, car si dans la deuxième partie searchString vaut nil, ce sera d'office une valeur nulle qui sera renvoyée (l'Objective-C permet d'envoyer des messages à  nil).

    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
  • octobre 2005 modifié #8
    Nuançons alors. Quand le type renvoyé n'est pas un objet, envoyer un message à  nil reverra une valeur nulle pour les types intégraux tant que la taille du type renvoyé est inférieure ou égale à  [tt]sizeof(void*)[/tt], qui vaut 4. Si cette taille est supérieure ou que le type renvoyé n'est pas un type intégral, la valeur renvoyée sera non définie. Parmi les types problématiques, on a donc: [tt]float[/tt], [tt]double[/tt],  [tt]long long[/tt] et [tt]struct[/tt], mais pour les BOOL et les int, c'est OK.
  • uocramuocram Membre
    15:51 modifié #9
    En utilisant le test :
    if ([searchString isEqualToString:@";"])

    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 :
    if (searchString == nil)

    cela ne fonctionne pas : le NSSearchField vide ne vérifie pas ce test.

    Seul, le test :
    if ([searchString length] == 0)

    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] ?
  • uocramuocram Membre
    15:51 modifié #10
    je n'avais pas testé correctement la solution de Supermic :

    if (searchString==nil || [searchString isEqualToString:@""])
    


    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.
Connectez-vous ou Inscrivez-vous pour répondre.