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方法で進捗状況:

今すぐ離れるときviewControllerと私はobserveValueForKeyPathが呼び出されていないと返信し、私はprogressViewを継続的に更新することはありません。上記コードに従って

progressViewの動作は、このビデオで示されている:

https://youtu.be/PVRT_Jjtdh4
+0

あなたのコードとは、KVOを使用する必要はありません、それ自体であなたのViewControllerを観察しているようです。あなたがビューを離れることがない場合は、あなたの進捗状況が更新される予定です。人々を混乱させるものは、あなたがあなたの進捗状況を気にする必要があります。あなたがそれを所有者のままにしておくと、viewControllerです。一方、progressViewがviewControllerの外側のビューである場合、viewControllerを観察する必要があるのはprogressView自体です。 – Lane

答えて

0

キー値コーディング(KVC)は、間接的にオブジェクトのプロパティにアクセスするための機構です。あなたのケースでは、 "進歩"はUIProgressViewのプロパティです。しかし、プロパティとして '進捗状況'を持たないUIViewControllerオブジェクトのオブザーバーを登録しました。

したがって、観察を取り外すために同じ操作を行い、また、self.progressView

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

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

selfを置き換える:

[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 instance]は、定義されたオブジェクトの進捗状況が変化しているクラスのインスタンスです。

+0

実際にそこにいる – abnerabbey

+0

この回答をお試しください。これで問題は解決します。 –

0

クラスが割り当て解除された後にのみオブザーバを削除する方が良い。だから、intsead viewWillDisappear:animated:に置くのあなたは以下同じ操作を行うことができます。

-(void) dealloc { 
     [self removeObserver:self forKeyPath:@"progress"] 
     [super dealloc]; 
} 
関連する問題