我正在使用UIProgressView
跟踪进度,并将观察员设置为我跟踪的属性。
我在viewWillAppear
添加了观察者,如下所示:
-(void)viewWillAppear:(BOOL)animated
{
[self addObserver:self forKeyPath:@"progress" options:0 context:nil];
}
当我在viewWillDisappear中移除观察者时,就像这样:
-(void)viewWillDisappear:(BOOL)animated
{
[self removeObserver:self forKeyPath:@"progress"];
}
在observeValueForKeyPath方法中,我更新了进度视图:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if([keyPath isEqualToString:@"progress"])
{
[self.progressView setProgress:self.progress animated:YES];
}
}
现在,当我离开此viewController
并且我返回时,observeValueForKeyPath
未被调用,我不会让progressView
不断更新。
此视频中显示了根据上述代码的progressView的行为: https://youtu.be/PVRT_Jjtdh4
答案 0 :(得分:0)
键值编码(KVC)是一种间接访问对象属性的机制。在您的情况下,“进度”是UIProgressView
的属性。但是您已经注册了UIViewController
对象的观察者,该对象没有'进展'作为属性。
因此请将self
替换为self.progressView
[self addObserver:self.progressView forKeyPath:@"progress" options:0 context:nil];
进入
[self addObserver:self.progressView forKeyPath:@"progress" options:0 context:nil];
另外,对于分离观察者也这样做:
[self removeObserver:self.progressView forKeyPath:@"progress"];
答案 1 :(得分:0)
通过示例查找更新的答案。这将对您有所帮助:
在这里,您必须在相对于接收器的关键路径上注册为值的观察者。您还需要设置选项。
使用:
-(void)viewWillAppear:(BOOL)animated
{
[[Receiver Instance] addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew
context:nil];
}
-(void)viewWillDisappear:(BOOL)animated
{
[[Receiver Instance] removeObserver:self forKeyPath:@"progress"];
}
休息是这样的。 这里,[Receiver instance]是类的实例,您定义的对象进度的值正在改变。
答案 2 :(得分:-1)
最好只在取消分配类后才删除观察者。因此,放入viewWillDisappear:animated:
的内容你可以在下面做同样的事情:
-(void) dealloc {
[self removeObserver:self forKeyPath:@"progress"]
[super dealloc];
}