写在最前面
大家都很忙, 这里我长话短说,希望能节约你一些时间
有学生类 Student
有两个属性 firstName 和 LastName. 如果想要firstName 或者 LastName 任意一个发生变化, 你都能收到, 就可以使用 属性依赖.
步骤
1. 在Student类
新增一个属性 例如叫 nameInfo
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *nameInfo;
- 给
nameInfo
添加观察者. - 在
Student类
实现属性关联方法
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"_nameInfo"])
{
NSSet *affectingKeys = [NSSet setWithObjects:@"lastName", @"firstName",nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
}
return keyPaths;
}
网上说 或者实现 下面这个方法行, 但是我测试的情况看,这个方法不行.
+ (NSSet *)keyPathsForValuesAffectingName {
return [NSSet setWithObjects:@"_lastName", @"_firstName", nil];
}
5 在Student类
实现观察者方法. 经过上面的属性依赖后, 如果firstName或者lastName变化后, 就会调用这个方法.强调这里只是告诉你,firstName 或者 lastName值改变了, 不会把他们的新,旧值带过来.
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"observe value %@", change);
}
6 切记 在dealloc 方法里移除观察者.
到此 属性依赖已经设置完成, 你可以在别的类里, 尝试改变一下first或者lastName的值.