1

我有父 UIViewController A 有一些属性。我有继承自 A 的子 UIViewController B、C、D。

我的问题是:在 B 中,我更改了 Parent 属性值。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

孩子 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来存储所有值并且运行良好,但我认为在这种情况下应该有更好的方法吗?

4

2 回答 2

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

您可能希望同步属性。

考虑到代码,这将改变所有孩子的价值。我知道这就是您所需要的(仅值共享),但是如果您还需要在值更改时发出通知,您可以添加一些方法来在值更改时通知子项(实例)。

于 2013-03-05T17:20:28.303 回答
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,不带引号)。(您通常也可以只查找新属性。)

如果要观察很多属性,那么每个孩子订阅每个属性的更改可能会很麻烦。你如何处理这取决于一切到底是如何相关的,但是嗯。不得不如此关心父母本身就是一种气味……

于 2013-03-05T16:23:00.323 回答