2013-03-05 34 views
1

我有父母的UIViewController A有一些屬性。我有孩子UIViewController B,C,D這是繼承自A.檢測父類變量或屬性是由其他子類更改objective-c

我的問題是: 在乙,我改變父屬性值。 C,D如何知道父值從B改變了?

基本上我想分享孩子之間的屬性。

在此先感謝。

代碼示例;

@interface A : UIViewController{ 
NSString *string1; //This is just example 
} 
@property (nonatomic, strong) NSString *string2; 
@end 

Child B級

@interface B : A 
@end 

@implementation B 
//here I change string1 and string2; 
@end 

Child C級

@interface C : A 
@end 

@implementation C 
//here I want to get changed string1 and string2 by Child A; 
@end 

兒童d

@interface D : A 
@end 

@implementation D 
//here I want to get changed string1 and string2 by Child A; 
@end 

目前,我使用辛格爾頓來存儲所有的VA魯和它運作良好,但我認爲應該有更好的辦法在這種情況下?

+0

父類/子類的層次結構還是視圖層次? – trojanfoe 2013-03-05 16:22:15

+0

KVO或模式觀察者。你可以谷歌它兩個。取決於你如何處理依賴關係,以及何時需要綁定它們。 – 2013-03-05 16:23:47

+0

'Singleton'和'NSNotification'將是一個很好的解決方案。當你改變單身人士的價值發送一個通知給C和D,並運行/調用C和D的方法。對我來說 – 2013-03-05 16:23:51

回答

1

我想你可以做的最簡單的事情是有繼承的屬性,但重寫父視圖中的getter和setter以便它讀/寫一個靜態變量。

@interface A : UIViewController 
@property (nonatomic, strong) NSString *sharedString; 
@end 

@implementation A 

static NSString* _sSharedString; 

- (NSString*) sharedString { 
    return _sSharedString; 
} 

- (void) setSharedString: (NSString*) aString { 
    _sSharedString = aString; 
} 

@end 

您可能希望同步該屬性。

這個,考慮到代碼,會改變所有孩子的價值。我明白那是你需要的(只是價值共享),但是如果你在值改變的時候也需要一個通知,你可以添加一些方法來在值發生變化時通知孩子(實例)。

+0

你以前試過嗎?我只是用這種方式,但不工作。 – brianLikeApple 2013-03-05 17:39:50

+0

@brianLikeApple是的,我剛剛做了一個例子,它運作良好。實際上屬性可以是**分配**,但它仍然有效。你如何實施它? – htafoya 2013-03-05 18:13:48

+0

是的!這是工作!這是最好的方法!非常感謝! – brianLikeApple 2013-03-06 09:39:14

0

當父類的屬性發生變化時,您可以發送消息。子類可以爲該消息實現一個方法,並在其中執行任何他們必須做的以適應變化。

我似乎記得這樣的事情已經被內置於可可雖然...

啊。這裏是。看看Key-Value Observation。只要屬性符合KVC,Cocoa會在屬性更改時自動發送消息。您只需在子中實現一個方法來處理它們,並訂閱更改事件。

所以在你的子類,你會這樣說

[self addObserver:self 
     forKeyPath:@"thePropertyName" 
      options:NSKeyValueObservingOptionNew 
      context:nil]; 

,並有像

的方法
-(void) observeValueForKeyPath:(NSString*)keyPath 
         ofObject:(id)observee 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    // here's where the magic happens 
} 

keyPath將更改屬性的名稱,change將包含在具有恆定名稱的某個鍵(名稱爲NSKeyValueChangeNewKey,不含引號)下的新值。 (您通常也可以查找新的房產。)

如果有很多屬性需要注意,那麼每個孩子都可能會訂閱每個屬性的更改,這可能會很麻煩。你如何處理這取決於所有事物的相關性,但是呃。必須非常在意父母本身是一種氣味本身...

+0

KVO聽起來不錯。如果沒有更好的辦法,我會給你打分。 – brianLikeApple 2013-03-05 16:48:50

+0

謝謝你的回答。但我猜htafoya的答案是更好的方法?你是這麼認爲的嗎?這就是爲什麼我給他留下了印記。 – brianLikeApple 2013-03-06 09:42:18

+0

@brianLikeApple:取決於你需要什麼,但我不太喜歡看起來像實例屬性的靜態屬性的想法。 – cHao 2013-03-06 14:52:29