0

我正在跟蹤UIProgressView的進度,並將觀察者設置爲正在跟蹤的屬性。observeValueForKeyPath在返回到UIViewController時未被調用

我添加觀察者在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

你的代碼似乎本身來觀察你的viewController,其中有沒有必要使用KVO。如果你沒有離開視圖,那麼這是預期的,你的進度視圖將被更新。什麼混淆了人,在這種情況下,當你離開它的所有者時,你必須關注你的progressView,因此viewController。另一方面,如果progressView是viewController的外部視圖,那麼需要觀察viewController的是progressView本身。 – Lane

回答

0

鍵值編碼(KVC)可以間接地訪問對象的屬性的機制。在你的情況下,「進展」是UIProgressView的財產。但是,您註冊了不具有「進度」屬性的UIViewController對象的觀察者。

因此與self.progressView

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

更換self

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

而且,分離觀察者做同樣的:

[self removeObserver:self.progressView forKeyPath:@"progress"];

+0

這不是問題所在。問題是當我離開視圖並返回時,不會調用observeValueForKeyPath,並且進度視圖不會更新。但是,我不留下看法,一切順利。 – abnerabbey

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實例]是您爲定義的對象進度正在改變的類的實例。

+0

他們實際上有 – abnerabbey

+0

試試這個答案。這將解決問題。 –

0

只有在課程被釋放後才能更好地移除觀察者。所以intsead在viewWillDisappear:animated:放置,你可以下同:

-(void) dealloc { 
     [self removeObserver:self forKeyPath:@"progress"] 
     [super dealloc]; 
} 
相關問題