Cocoa: Intelligente Ordner mit NSPredicate

In der Regel hat man eine Liste von Objekten, deren Inhalt man darstellen möchte, in einem NSArray oder NSMutableArray gespeichert und greift über die Indizes auf die Inhalte zu, um sie in einer Tabelle oder ähnlichem Darzustellen.

[more]

Beispiel:

Man hat eine Klasse Adresse, in der Name, Vorname und Telefonnummer gespeichert werden (ich gebe zu, ich bin sehr kreativ, was Beispiele angeht ;) ).
In dieser Klasse werden nun nur die entsprechenden Member-Variablen angelegt und die dazugehörigen Getter- und Setter-Methoden.

@interface Adresse : NSObject {
NSString *_name;
NSString *_vorname;
NSString *_telefon; //Wir nehmen einen String, da auch Sonderzeichen enthalten sein können
}

	

- (NSString *)name; - (void)setName:(NSString *)newName;

- (NSString *)vorname; - (void)setVorname:(NSString *)newVorname;

- (NSString *)telefon; - (void)setTelefon:(NSString *)newTelefon;

@end

Die Implementierung beinhaltet nur die entsprechenden Getter- und Setter-Methoden, daher werde ich sie hier nicht einfügen.

Um die Adressen zu verwalten, legen wir einen Controller an, der über die üblichen Accessoren für ein Array verfügt:

@interface AdressController : NSObject {
NSMutableArray *_adressen;
}

	

- (NSMutableArray *)adressen; - (void)setAdressen:(NSMutableArray *)newAdressen;

- (unsigned int)countOfAdressen; - (id)objectInAdressenAtIndex:(unsigned int)index; - (void)insertObject:(id)anObject inAdressenAtIndex:(unsigned int)index; - (void)removeObjectFromAdressenAtIndex:(unsigned int)index; - (void)replaceObjectInAdressenAtIndex:(unsigned int)index withObject:(id)anObject;

@end

Die Implementierung bleibt wieder einmal bei euch ;)

Um nun Intelligente Ordner für die Adressen anlegen zu können (z. B. alle Adressen, deren Name mit „Be“ beginnt, benötigen wir erst einmal eine Klasse für die Ordner:

@interface smartFolder : NSObject {
NSPredicate *_predicate; //Unser Predicate zur Filterung des Arrays
}

	

- (NSPredicate *)predicate; - (void)setPredicate:(NSPredicate *)newPredicate;

- (NSArray *)adressen; //Hier werden die gefilterten Adressen ausgegeben @end

Um auf die Adressen zugreifen zu können, benötigen wir die jeweils aktuellen Adressen des AdressController. Also fügen wir in diesem eine statische Variable sharedAdressController hinzu, sowie eine Methode _+ (AdressController *)sharedAdressController_

//nach @implementation fügen wir eine statische Variable ein und weisen ihr den Wert nil zu
static sharedAdressController *sharedController = nil;

//in der Init-Methode weisen wir sharedAdressController uns selbst zu - (id)init {

if (self = [super init]) { //hier erfolgen Zuweisungen } sharedAressController = self; return self; }

//Implementierung der Methode für unser Singleton + (AdressController *)sharedAdressController { @synchronized(self) { if (sharedAdressController == nil) { sharedAdressController = [[self alloc] init]; } } return sharedAdressController; }

Nun können wir nach einem Import der Klasse in unserem „SmartFolder“ auf die Instanz zugreifen und so die aktuellen Adressen bekommen.

-(NSArray *)adressen
{
NSArray *gefiltert = [[[AdressController sharedAdressController] adressen] filteredArrayUsingPredicate:[self predicate]];
return gefiltert;
}

Durch die Methode filteredArrayUsingPredicate: kann man ein Array mittels eines Ausdrucks (ähnlich SQL) filtern und so ein Array mit den entsprechenden Werten erhalten.
Wollen wir einen Intelligenten Ordner erstellen, der alle Adressen enthält, deren Name mit „Be“ beginnt, so könnten wir den Ausdruck SELF.name beginswith[c] 'be' verwenden.
Es können aber auch genauso Reguläre Ausdrücke oder die Operatoren < > || && usw verwendet werden.

Mehr Informationen über NSPredicates erfahrt ihr im Predicates Programming Guide bei Apple Developer


Ähnliche Artikel

Dein Kommentar:

Sämtliche Html-Tags werden gelöscht, der Kommentar kann mit Textile formatiert werden.
Vor dem Absenden müsst ihr euch einmal die Vorschau ansehen.