2011-02-04 2 views
9

Je suis en train de faire des sections en vue de la table en fonction de l'alphabet et de trier mes entrées par ordre alphabétique dans ces sections.NSPredicate sur NSDictionary

J'ai recueilli la première lettre dans chaque entrée de bandsArray dans bandsArrayIndex et j'essaye maintenant d'employer NSPredicate pour compter combien de chaque lettre il y a.

Je fais cela en suivant this guide.

Ils utilisent un NSArray et je suis en utilisant un NSDictionary et ne peut pas sembler le faire fonctionner. Quelqu'un peut m'aider?

l'application se bloque lorsque vous essayez de montrer la vue avec la vue de la table en elle. Dans Debugger Console l'erreur suivante apparaît:

* en raison de l'application Mettre fin exception uncaught « NSInvalidArgumentException », raison: « Ne peut pas faire une opération de sous-chaîne par quelque chose qui est pas une chaîne

C'est mon code

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSString *alphabet = [bandsArrayIndex objectAtIndex:section]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet]; 
    NSArray *letters = [bandsArray filteredArrayUsingPredicate:predicate]; 

    return [letters count]; 
} 

EDIT: Ceci est mon groupe sArray.

L'en-tête

NSMutableArray *bandsArray; 

@property (nonatomic, retain) NSMutableArray* bandsArray; 

La mise en œuvre

// 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]]; 
+0

Vous fuite de mémoire comme une passoire lorsque vous créez 'bandsArray '. –

+0

Pouvez-vous montrer votre bandsArray? Est-ce juste un tableau NSString? Je n'avais pas de tels problèmes avec NSPredicate. Ce devrait être juste un détail simple. Si votre bandsArray n'est pas de NSStrings, vous devez filtrer par la propriété que vous recherchez. –

Répondre

22

Voulez-vous dire que bandsArray est un tableau de dictionnaires? Dans ce cas, et en supposant que chaque dictionnaire a une clé name, vous devriez être en mesure de changer le prédicat à quelque chose comme @"SELF.name beginswith[c] %@".

Si, d'autre part, bandsArray est en fait un dictionnaire lui-même, peut-être que vous voulez faire [[bandsArray allKeys] filteredArrayUsingPredicate...].

+0

'@" SELF.name commence par [c]% @ "' a fait l'affaire! Merci beaucoup! – simonbs

+0

Merci a travaillé comme un charme! – Meet

0

Désolé, je ne ai pas remarqué que vous aviez un NSArray de NSDictionaries.

Lire ce fil: Using NSPredicate to filter an NSArray based on NSDictionary keys

Lorsque vous utilisez NSDictionary, vous devriez vérifier par sa clé ... Je ne suis pas sûr que vous utilisez la bonne approche! Je ferais quelque chose comme: @implementation Word: NSObect { NSString * titre; }

alors je créer un NSArray de mots et de filtrer sur eux avec: @ "title beginswith [c]% @"

6
#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; 
} 
+0

Ceci est la bonne réponse, vérifié! –

+1

Merci @isaak ça m'a beaucoup aidé –