0

Je suis suivi d'une progression avec un UIProgressView et je place un observateur sur la propriété que je suis en train de suivre.observeValueForKeyPath n'est pas appelé lors du retour à un UIViewController

-je ajouter l'observateur dans le viewWillAppear, comme ceci:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self addObserver:self forKeyPath:@"progress" options:0 context:nil]; 
} 

Et quand je retire l'observateur dans le viewWillDisappear, comme ceci:

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [self removeObserver:self forKeyPath:@"progress"]; 
} 

Et dans la méthode observeValueForKeyPath I mis à jour le vue d'avancement:

-(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]; 
    } 
} 

Maintenant, quand je quitte ce viewController et je renvoie le observeValueForKeyPath n'est pas appelé et je ne reçois pas le progressView mis à jour en permanence.

Le comportement du progressView selon le code ci-dessus est représenté sur cette vidéo: https://youtu.be/PVRT_Jjtdh4

+0

Votre code semble observer votre viewController par lui-même, dans lequel il n'y a pas besoin d'utiliser KVO. C'est normal si vous ne quittez pas la vue, votre vue d'avancement sera mise à jour. Ce qui perturbe les gens est dans ce cas, vous devez vous préoccuper de vos progrès. Voir quand vous quittez son propriétaire, donc viewController. D'un autre côté, si votre progressView est une vue extérieure de viewController, ce qui doit être vu par viewController, c'est la vue de progression elle-même. – Lane

Répondre

0

-valeur de clé de codage (KVC) est un mécanisme d'accès à des propriétés d'un objet indirectement. Dans votre cas "progrès" est la propriété de UIProgressView. Mais vous avez enregistré un observateur pour l'objet UIViewController qui n'a pas de 'progression' en tant que propriété.

remplacer Par conséquent self avec self.progressView

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

dans

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

En outre, faire la même chose pour détacher observateur:

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

+0

Ce n'est pas le problème. Le problème est lorsque je quitte la vue et que je reviens, le paramètre observeValueForKeyPath n'est pas appelé et la vue de progression n'est pas mise à jour. Mais tout va bien alors que je ne quitte pas la vue. – abnerabbey

0

Trouvez la réponse mise à jour avec l'exemple. Cela vous aidera:

Ici, vous devez vous enregistrer en tant qu'observateur de la valeur à un chemin de clé par rapport au récepteur. Aussi, vous devez définir l'option.

Utilisation:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [[Receiver Instance] addObserver:self forKeyPath:@"progress" options:NSKeyValueObservingOptionNew 
context:nil]; 
} 

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [[Receiver Instance] removeObserver:self forKeyPath:@"progress"]; 
} 

Rest est comme il est. Ici, [Receiver instance] est l'instance de classe dans laquelle vous modifiez la valeur de la progression de l'objet défini.

+0

Ils sont réellement là – abnerabbey

+0

Essayez cette réponse. Cela va résoudre le problème. –

0

Mieux vaut supprimer l'observateur seulement après que la classe ait été désallouée. Alors intsead de mise en viewWillDisappear:animated: vous pouvez faire la même chose ci-dessous:

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