J'ai maintenant presque compris comment filtrer un NSTreeController, pour cela j'ai sous-classifié NSManagedObject et ajouté du code à mon délégué d'application, j'ai également lié mon NSSearchField au filtrePredicate de mon délégué d'application mais je pense que je dois connecter mon NSTreeController et NSSearchField d'une manière ou d'une autre pour le faire fonctionner. Ci-dessous j'ai posté tout le code que j'ai utilisé jusqu'ici pour essayer de le faire fonctionner.Filtrage d'un contrôleur d'arbre
NSManagedObject Sous-classe-tête de fichier.
@interface Managed_Object_Sub_Class : NSManagedObject {
NSArray *filteredChildren; // this should fix the compiler error
}
- (NSArray *)filteredChildren;
@end
NSManagedObject Mise en œuvre sous-classe fichier.
@implementation Managed_Object_Sub_Class
static char *FilteredChildrenObservationContext;
- (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context {
if (self = [super initWithEntity:entity insertIntoManagedObjectContext:context]) {
[[NSApp delegate] addObserver:self forKeyPath:@"filterPredicate" options:0 context:&FilteredChildrenObservationContext];
[self addObserver:self forKeyPath:@"subGroup" options:0 context:&FilteredChildrenObservationContext];
}
return self;
}
// use finalize with GC
- (void)dealloc {
[[NSApp delegate] removeObserver:self forKeyPath:@"filterPredicate"];
[self removeObserver:self forKeyPath:@"subGroup"];
[super dealloc];
}
- (NSArray *)filteredChildren {
if (filteredChildren == nil) {
NSPredicate *predicate = [[NSApp delegate] filterPredicate];
if (predicate)
filteredChildren = [[[self valueForKey:@"subGroup"] filteredArrayUsingPredicate:predicate] copy];
else
filteredChildren = [[self valueForKey:@"subGroup"] copy];
}
return filteredChildren;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if (context == &FilteredChildrenObservationContext) {
[self willChangeValueForKey:@"filteredChildren"];
[filteredChildren release];
filteredChildren = nil;
[self didChangeValueForKey:@"filteredChildren"];
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
@end
code ajouté à l'App délégué-tête de fichier
NSPredicate *filterPredicate;
code ajouté à l'App délégué la mise en œuvre Fichier
- (NSPredicate *)filterPredicate {
return filterPredicate;
}
- (void)setFilterPredicate:(NSPredicate *)newFilterPredicate {
if (filterPredicate != newFilterPredicate) {
[filterPredicate release];
filterPredicate = [newFilterPredicate retain];
}
}
champ de recherche Reliure
alt text http://snapplr.com/snap/vs9q
Cela ne fonctionne pas encore, et c'est pourquoi je demande ce que je dois faire d'ici pour le faire fonctionner, comme je l'ai dit, je pense que je dois connecter le NSSearchField et NSTreeController Ensemble d'une certaine manière.