检测父类变量或属性由objective-c中的其他子类更改

时间:2013-03-05 16:15:18

标签: ios objective-c

我有父UIViewController A,它有一些属性。我有一个继承自A。

的子UIViewController B,C,D

我的问题是: 在B中,我更改了父属性值。如何知道C,D知道父值是否从B改变了?

基本上我想在孩子之间分享属性。

提前致谢。

代码示例;

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

儿童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

目前,我正在使用 Singleton 存储所有价值并且运行良好,但我认为在这种情况下应该有更好的方式

2 个答案:

答案 0 :(得分: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

您可能希望同步该属性。

考虑到代码,这将改变所有孩子的价值。我理解这就是你所需要的(只有价值共享),但是如果你在值发生变化时也需要通知,你可以添加一些方法,在值发生变化时通知子(实例)。

答案 1 :(得分:0)

您可以让父类在其属性更改时发送消息。子类可以为该消息实现一种方法,并在其中做任何他们必须做的事情来适应变化。

我似乎记得这样的东西已经被Cocoa内置了......

稀释。这里是。看看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,无引号)的特定键下的新值。 (你通常也可以只查看新房产。)

如果要观看很多属性,每个孩子订阅每个属性的更改可能会很麻烦。你如何处理这取决于一切都与之相关,但是呃。不得不如此关心父母本身就是一种气味......