2011-02-04 8 views
9

Sto cercando di creare sezioni in una vista tabella in base all'alfabeto e di ordinare le mie voci in ordine alfabetico in queste sezioni.NSPredicate su NSDictionary

Ho raccolto la prima lettera in ogni voce di bandsArray in bandsArrayIndex e ora sto cercando di utilizzare NSPredicate per contare quante lettere ci sono.

Sto facendo questo seguendo this guide.

Stanno usando un NSArray e sto usando un NSDictionary e non riesco a farlo funzionare. Qualcuno mi può aiutare?

L'applicazione si arresta in modo anomalo quando si tenta di mostrare la vista con la vista tabella. Nel debugger console viene visualizzato il seguente errore:

* terminazione app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: 'Non può fare un'operazione di stringa con qualcosa che non è una stringa

Questo è il mio codice

- (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: Questa è la mia band sArray.

L'intestazione

NSMutableArray *bandsArray; 

@property (nonatomic, retain) NSMutableArray* bandsArray; 

L'implementazione

// 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

Stai perdite di memoria come un setaccio quando si crea 'bandsArray '. –

+0

Puoi mostrare il tuo bandsArray? È solo un array NSString? Non ho avuto problemi con NSPredicate. Dovrebbe essere solo un semplice dettaglio. Se il tuo bandsArray non è di NSStrings, dovresti filtrare in base alla proprietà che stai cercando. –

risposta

22

Vuoi dire che bandsArray è un array di dizionari? In tal caso, e assumendo che ogni dizionario abbia una chiave name, dovresti essere in grado di modificare il predicato su qualcosa come @"SELF.name beginswith[c] %@".

Se, d'altra parte, bandsArray è in realtà un dizionario stesso, forse si desidera fare [[bandsArray allKeys] filteredArrayUsingPredicate...].

+0

'@" SELF.name beginswith [c]% @ "' ha fatto il trucco! Grazie mille! – simonbs

+0

Grazie ha funzionato come un fascino! – Meet

0

Scusa, non ho notato che avevi un NSArray di NSDictionaries.

letto questa discussione: Using NSPredicate to filter an NSArray based on NSDictionary keys

Quando si utilizza NSDictionary, si dovrebbe verificare con la sua chiave ... Non sono sicuro che si sta utilizzando l'approccio giusto!

Vorrei fare qualcosa come: @implementation Word: NSObect { NSString * title; }

quindi vorrei creare una NSArray di parole e filtrare su di loro con: @ "titolo 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

Questa è la risposta giusta, verificata! –

+1

Grazie a @isaak mi ha aiutato molto –