当我使用-setProgress:animated时,我无法用KVO观察UIProgressView的进度值:

时间:2015-01-28 06:45:46

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

我已经设置了

[self.progressView addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew context:nil];

如果我使用self.progressView.progress = 0.1;来改变进度,那就没关系。

但如果我使用[self.progressView setProgress:0.1 animated:YES];,则无法触发-observeValueForKeyPath:ofObject:change:context:方法。

我现在能做什么?现在我无法更改[self.progressView setProgress:0.1 animated:YES];,因为这个代码在另一个库中。

2 个答案:

答案 0 :(得分:0)

你可能在这里运气不好。您无法控制UIProgressView的实现。如果你愿意,可以向Apple提交一个bug,但我不会屏住呼吸,因为......

从概念上讲,w / r / t是iOS和OS X中使用的MVC模式,这不是你应该首先做的事情。观点应该是“观察者”,而不是“观察者”。你应该找到另一种方法来实现这一目标。

是的,您可能会在调用原始实现之前和之后,通过调用-setProgress:animated:的实现调用-willChangeValueForKey:-didChangeValueForKey:来解决此问题,但请自己帮个忙找到另一种方式。

答案 1 :(得分:0)

我也遇到过这个问题。

我正在使用以下代码来解决此问题。

CGFloat progress = 0.3;//this is just a example.
if (progress < self.progressView.progress) {
    self.progressView.progress = progress;
}
else
{
    [UIView animateWithDuration:0.3 animations:^{
        [self.progressView setProgress:progress animated:YES];
    }completion:^(BOOL finished) {
        //avoid key-value observer invalid
        self.progressView.progress = progress;
    }];
}

现在这对我有用。 希望它可以帮助别人。