每当属性值发生变化时,都会引发事件

时间:2015-10-23 10:22:52

标签: objective-c

我有一个有2个属性的类:

@property (copy) NSString *name; //name of the file
@property (copy) NSString *path; //path of the file
@property NSImage *img; //icon of the file

问题 我希望在路径更改时命名和img自动填充,就像每当路径更改时应该引发事件,以便我可以刷新名称和img。

非常感谢提前。请注意,我对objective-c已经有2个月了,而且我在过去2年里一直处于.net世界。

2 个答案:

答案 0 :(得分:3)

您可以使用完善的 KVO(键值观察)技术

第1步:假设您已经有一个模型类说MyData具有这些属性,请设置您的控制器类或创建该模型对象的位置作为path的观察者像这样的东西:

MyData *data = [[MyData alloc] init];
[data addObserver:self forKeyPath:@"path" options:NSKeyValueObservingOptionNew context:NULL];

第2步:实施observeValueForKeyPath:ofObject:change:context:方法以收听path属性中的任何更改。像这样:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    MyData *myData = (MyData *)object;
    myData.name = @"My Name";
    myData.image = // Set your image here
}

第3步:重要的是,每当您的对象被取消分配时,不要忘记将自己移除为此属性的观察者。否则你可能会崩溃!

答案 1 :(得分:2)

(已更新以防止循环播放)
您可以使用setter函数。而不是使用MyClass.name = ...声明该类中的函数并使用它来更改值:

- (void) setPath:(NSString*)newvalue{
    _path = newvalue;
    [self updateNameAndPicture];
}

然后,当您更改它时,请使用

[InstanceOfMyClass setPath:@"/new/path/"];