2010-10-22 46 views
1

我有三個不同的屬性,x,y,z。如果他們全都轉爲零,我需要採取行動,如果其中一個設置爲值!=零,我必須執行不同的操作。多個屬性改變時執行動作

我目前實行的是以下幾點:

@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; 
    } 
} 

它的工作原理,但我希望有這樣的事情更方便,更好的解決方案,我目前的眺望。打我!

+0

這實際上是一個非常聰明的解決方案。 :) – 2010-10-22 16:00:54

+0

非常感謝,但觀察自己似乎只是對我錯了。 – 2010-10-22 16:03:48

+0

真的嗎?我一直這樣做,特別是我可以保留我的'@綜合'屬性,但是當事情發生變化時仍然會做出反應。請不要忘記在'-dealloc'中以觀察者身份移除自己。 – 2010-10-22 16:08:06

回答

1

我想你是如何擁有它是關於最乾淨和最可可的方式,你可以。而爲了記錄,觀察self並不是一個糟糕的設計決定。