我有父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 存储所有价值并且运行良好,但我认为在这种情况下应该有更好的方式?
答案 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
,无引号)的特定键下的新值。 (你通常也可以只查看新房产。)
如果要观看很多属性,每个孩子订阅每个属性的更改可能会很麻烦。你如何处理这取决于一切都与之相关,但是呃。不得不如此关心父母本身就是一种气味......