6
votes

Retirobobserver ne fonctionne pas

J'ai le code suivant: xxx pré>

donc je mettez des points d'arrêt au début de ViewDidLoad code> méthode, dans ViewDidDisappear code>. Lorsque je lance une application qui va d'abord à ViewDidLoad Code>, après le téléchargement, il est allé sur ViewDidDisappear code>. P>

mais pendant mon application, je téléchargeais à nouveau des données et publier Notification: NsdownloadComplete code>. Et dans ce VC, c'est un travail, mais j'ai retiré ultérieurement en utilisant: p>

2013-06-10 14:32:05.646 myApp[9390:c07] addObserver
2013-06-10 14:32:06.780 myApp[9390:c07] removeObserver


5 commentaires

Est-ce que ce code copie et collé? Je viens de me demander parce que votre ViewDidLoad est de seulement 3 lignes et après avoir des déclarations qui ne sont dans aucune méthode. Ce n'est pas valide;)


@Has tout fonctionne bien, sauf ma question =)


Désolé, mais ce n'est pas le cas;) l'attelle bouclée après auto.AcityIndicator.originy = 355.f; est faux. Supprimer et vous aurez un code valide;)


@Has i Modifier, erreur, désolé


Seulement removeobserver dans Dealloc


3 Réponses :


3
votes

Le modèle que vous utilisez n'est pas correct. Vous devriez ajouter l'observateur dans ViewDidAppear: et supprimez-le dans ViewDidDisappear: . .


2 commentaires

Ou ajouter l'observateur dans ViewWillappear:


@ E1985 N'aide pas. Et viewwillappear: n'aide pas aussi



5
votes

Qu'est-ce que E1985 tente d'exposer est que votre addobserver et removeobserver Les appels ne sont pas correctement équilibrés. ViewDiDloadLoad est appelé une seule fois après l'initialisation VC, mais ViewDidDisappear est appelé chaque fois que le contrôleur de vue est déplacé de l'écran.

Pour résoudre votre problème, vous devez équilibrer votre problème. Code> addobserver et removeobserver appels, soit en les faisant dans ViewDidLoad et l'autre dans dealloc ou - comme E1985 suggérées - dans ViewDidIDAppear: et ViefDidDisappear: .

EDIT : OK, votre problème vient donc du fait que vous utilisez addobserverforname: Object: Queue: UtilisationBLOCK: qui ne vous enregistrez pas auto comme observateur (comme addobserver: sélecteur: nom: objet: ferait si vous Pass auto comme premier argument).

Donc, dans votre cas, [[NSNOTIFICATIONCENTER BLATTERCENTER] Supprimerserver: auto]; ne fait rien parce que n'est pas un observateur. Vous devriez plutôt appeler rememiobserver: sur la valeur de retour de addobserverforname: Objet: Queue: UtilisationBLOCK: , comme indiqué dans le doc :

Valeur de retour

Un objet opaque à agir en tant qu'observateur.

Donc, votre code devrait donc ressembler à quelque chose comme: xxx


3 commentaires

Je déménage dans la viefDididAppear: et aucun résultat = (


S'il vous plaît expliquer le problème plus clairement que. Qu'est-ce que "ne fonctionne pas"?


J'ajoute l'écran où vous pouvez voir ce bloc appelé après la méthode SupprimerServer.



24
votes

Outre l'ajout / Supprimer des appels d'observateurs non bien équilibrés, à noter dans les autres réponses, il y a un autre problème.

Votre code pour supprimer l'observateur est faux. Pour un observateur basé sur un bloc, la valeur de retour de addobserver doit être donnée en tant qu'argument sur RejeterObserver . Donc, vous devriez ajouter une propriété xxx

à la classe. Ensuite, vous ajoutez l'observateur avec xxx

et retirez-le avec xxx


1 commentaires

Merci beaucoup de Martin, votre solution fonctionne si bien.