2009-08-05 7 views
1

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.

Répondre

1

Encore une fois, j'ai répondu à ma propre question, j'espère aussi que cela aidera d'autres personnes afin qu'ils sachent comment filtrer un NSTreeController.

Pour que cela fonctionne à partir de mon message ci-dessus, procédez comme suit.

1.Pour votre entité, définissez la classe comme votre sous-classe NSManagedObject dans mon cas JGManagedObject.

alt text http://dvlp.me/c3k

2.Pour votre champ de recherche IB définir le format de prédicat à ce que vous voulez filtrer (la propriété de votre entité, pour moi, c'est le nom).

alt text http://dvlp.me/9k9rw