在返回到UIViewController

时间:2017-06-21 02:03:33

标签: ios objective-c key-value-observing uiprogressview viewwillappear

我正在使用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

3 个答案:

答案 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];
}