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

Ios 检测父类变量或属性被objective-c中的其他子类更改,ios,objective-c,Ios,Objective C,我有一个父UIViewController A,它有一些属性。我有子UIViewController B、C、D,它们是从A继承的 我的问题是: 在B中,我更改父属性值。C、D如何知道父值已从B更改 基本上我想在孩子之间共享财产 提前谢谢 代码示例 @interface A : UIViewController{ NSString *string1; //This is just example } @property (nonatomic, strong) NSString *string2;

我有一个父UIViewController A,它有一些属性。我有子UIViewController B、C、D,它们是从A继承的

我的问题是: 在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
儿童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

目前,我正在使用单例来存储所有值,它工作得很好,但我认为在这种情况下应该有更好的方法

您可以让父类在其属性更改时发送消息。子类可以为该消息实现一个方法,并在其中执行它们必须执行的任何操作以适应更改

我似乎还记得像这样的东西已经被植入可可中了

啊。给你。调查只要属性符合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
,无引号)。(您通常也可以查找新属性。)


如果有很多属性需要查看,那么每个孩子订阅每个属性的更改可能会变得很麻烦。你如何处理这件事取决于每件事的关联程度,但是呃。必须如此关心父类本身就是一种气味…

当父类的属性更改时,您可以让父类发送消息。子类可以为该消息实现一个方法,并在其中执行它们必须执行的任何操作以适应更改

我似乎还记得像这样的东西已经被植入可可中了

啊。给你。调查只要属性符合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
,无引号)。(您通常也可以查找新属性。)


如果有很多属性需要查看,那么每个孩子订阅每个属性的更改可能会变得很麻烦。你如何处理这件事取决于每件事的关联程度,但是呃。必须如此关心父对象本身就是一种气味…

我想最简单的方法就是继承属性,但在父视图中重写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
您可能希望同步该属性


这将改变所有子项的值。我知道这是您所需要的(只是值共享),但如果您还需要在值更改时发出通知,则可以添加一些方法,在值更改时通知子对象(实例)。

我想您可以做的最简单的事情就是拥有继承的属性,但是在父视图中重写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
您可能希望同步该属性



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

类层次结构或视图层次结构方面的父级/子级?KVO或模式观察者。你可以用谷歌搜索两者。取决于您如何处理依赖关系以及何时需要绑定它们。
Singleton
NSNotification
将是一个很好的解决方案。当您更改单例值时,会向C和D发送通知,并在C和D中运行/调用方法。在我看来,这是一个非常令人困惑的设计或问题。如果A是单态,B,C,D从中继承?因此,B、C和D对象将持有a的不同实例。您能否更具体地说明您的类层次结构更新问题,希望它在类层次结构或视图层次结构方面是clearParent/child?KVO或pattern observer。你可以用谷歌搜索两者。取决于您如何处理依赖关系以及何时需要绑定它们。
Singleton
NSNotification
将是一个很好的解决方案。当您更改单例值时,会向C和D发送通知,并在C和D中运行/调用方法。在我看来,这是一个非常令人困惑的设计或问题。如果A是单态,B,C,D从中继承?所以B、C和D对象将持有a的不同实例。您能否更具体地说明您的类层次结构更新问题,希望clearKVO听起来不错。如果没有更好的办法,我会给你打分。谢谢你的回答。但我想htafoya的答案是更好的方式?你这样认为吗?这就是我给马克的原因。@brianlikeaple:这取决于你需要什么,但我并不喜欢静态属性看起来像实例属性。KVO听起来很棒。如果没有更好的办法,我会给你打分。谢谢你的回答。但我想htafoya的答案是更好的方式?你这样认为吗?这就是我给马克的原因。@brianLikeApple:这取决于你需要什么,但我不太喜欢静态属性看起来像实例属性的想法。你以前试过吗?我只是用