2010-10-22 5 views
1

J'ai trois propriétés différentes, x, y et z. S'ils tournent tous à zéro, je dois faire une action, et si l'un d'entre eux est réglé sur une valeur! = Nil, je dois effectuer une action différente.Effectuer une action lorsque plusieurs propriétés changent

Mon implémentation actuelle est la suivante:

@property (readonly) NSNumber *meta; 

+ (NSSet *)keyPathsForValuesAffectingMeta 
{ 
    return [NSSet setWithObjects:@"x", @"y", @"z", nil]; 
} 

- (void)awakeFromNib 
{ 
    [self addObserver:self forKeyPath:@"meta" options:0 context:NULL]; 
} 

- (NSNumber *)meta 
{ 
    BOOL meta = x || y || z; 
    return [NSNumber numberWithBool:meta]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    BOOL meta = [[self meta] boolValue]; 
    if (meta != _flags.meta) { 
    if (meta) { 
     [self showSomeStuff]; 
    } 
    else { 
     [self hideSomeStuff]; 
    } 

    _flags.meta = meta; 
    } 
} 

Il fonctionne, mais je l'espère, il est beaucoup plus facile et une meilleure solution pour quelque chose comme ça, que je suis actuellement méconnais. Frappez-Moi!

+0

C'est en fait une solution très intelligente. :) –

+0

Eh bien merci, mais observer soi-même semble tout simplement faux pour moi. –

+0

vraiment? Je le fais tout le temps, spécifiquement pour que je puisse conserver mes propriétés '@ synthesize''d, mais je réagis quand les choses changent. N'oubliez pas de vous retirer en tant qu'observateur dans '-dealloc'. –

Répondre

1

Je pense que vous l'avez, c'est la manière la plus propre et la plus semblable à Cocoa que vous pourriez. Et pour mémoire, l'observation self n'est pas une mauvaise décision de conception.

Questions connexes