9
votes

Nspredicate sur NsDictionary

J'essaie de faire des sections dans une vue de table basée sur l'alphabet et de trier mes entrées alphabétiquement sous ces sections.

J'ai rassemblé la première lettre de chaque entrée de BandsarrayIndex et j'essaie maintenant de Utilisez NSpredicate pour compter combien de chaque lettre il y a. P>

Je le fais en suivant ce guide . P>

Ils utilisent un Nsarray et j'utilise un NSDictionary et n'arrivent pas à le faire fonctionner. Quelqu'un peut-il m'aider? P>

L'application se bloque lorsque vous essayez de montrer la vue avec la vue de table. Dans la console de débogueur, l'erreur suivante est affichée: p>

* em> application de terminaison en raison d'une exception non capturée 'NsinvalidargumentException', raison: 'Je ne peux pas faire une opération de sous-chaîne avec quelque chose qui n'est pas une chaîne p> blockQuote>

Ceci est mon code p> xxx pré>

édition: ceci est mon bandeau. P>

L'en-tête P>

// set array from plist
NSString *path = [[NSBundle mainBundle] pathForResource:@"Bands" ofType:@"plist"];
NSMutableArray* tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.bandsArray = tmpArray;

// sort array after name ascending
NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[bandsArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];


2 commentaires

Pouvez-vous montrer votre groupe? Est-ce juste un tableau Nstring? Je n'avais pas de tels problèmes avec Nspredicate. Ce devrait être juste un détail simple. Si votre bande de bande n'est pas de Nstrings, vous devriez filtrer par la propriété que vous recherchez.


Vous fuyez la mémoire comme un tamis lorsque vous créez bandsarray .


3 Réponses :


22
votes

Voulez-vous dire que bandsarray est une gamme de dictionnaires? Si tel est le cas, et en supposant que chaque dictionnaire a une touche nom , vous devez pouvoir modifier le prédicat à quelque chose comme @ "auto.name commencewith [c]% @" .

Si, d'autre part, bandsarray est en fait un dictionnaire lui-même, peut-être que vous voulez faire [["Bandsarray Allkkeys] filteredAredAredAredicate ...] .


1 commentaires

@ "Self.name commence entre [c]% @" l'astuce! Merci beaucoup!



0
votes

Désolé, je n'ai pas remarqué que vous avez eu un NSARRAY DE NSDITIONS.

lire ce fil: Utilisation de Nspredicate pour filtrer un Nsarray basé sur les clés Nsdictionnaires

Lorsque vous utilisez NSDictionary, vous devez vérifier par sa clé ... Je ne suis pas sûr que vous utilisiez la bonne approche!

Je ferais quelque chose comme: @Implementalation Word: Nsobect { Nstring * Titre; }

Ensuite, je créerais un nsarray de mots et filtreriez-y avec: @ "Titre commencewith [C]% @"


0 commentaires

6
votes
#import <Foundation/Foundation.h>
// clang -framework Foundation Siegfried.m 
    int
main() {
    NSArray *arr = @[
        @{@"1" : @"Fafner"},
        @{@"1" : @"Fasolt"}
    ];
    NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"];
    NSArray *res = [arr filteredArrayUsingPredicate:p];
    NSLog(@"Siegfried %@", res);
    return 0;
}

1 commentaires

Merci @isaak Cela m'a beaucoup aidé