Frage

Ich habe einen Fall, in dem die untergeordnete Ansicht eine Benachrichtigung an seine übergeordnete Ansicht sendet. Jetzt rufe ich an addObserver: in viewWillAppear: und removeObserver: in viewWillDisappear:. Aber ich vermute, das ist seitdem nicht korrekt viewWillAppear: Anrufe, wenn die Ansicht aktualisiert wird.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Vielen Dank.

War es hilfreich?

Lösung

Eigentlich ist das eine schlechte Idee. Wenn der Speicher niedrig wird, erhält Ihr Ansichtskontroller möglicherweise eine Speicherwarnung. Das Standardverhalten in dieser Instanz besteht darin, Ihre Ansicht zu löschen (wenn Sie derzeit nicht auf dem Bildschirm sind). In diesem Fall können Sie die ViewDIDLoad -Nachricht ein zweites Mal gesendet haben (nach dem Speicherereignis, wenn Ihre Ansicht durch den Navigationscontroller auf den Bildschirm zurückgeführt wird). So haben Sie zwei Registrierungen desselben Objekts, jedoch nur eine Entfernung (in seinem Overleger)

Eine bessere Lösung besteht darin, ein Flag festzulegen, in dem Sie sich registriert haben oder sich in Ihrer Init -Methode registrieren.

Andere Tipps

Ich denke, die richtigen Positionen, die Sie zur Benachrichtigung registrieren können viewDidLoad Methode und korrekte Position zu Unregister für die gleichen Benachrichtigungen ist dealloc Methode.

Benn hat recht - aber ich fand einen anderen, potenziell zerbrechlich, viel um das herum. Ich habe das gerade entdeckt, weil ich für immer das "... ausgearbeitet wurde, während die wichtigsten Wertschöpfungsbeobachter noch damit registriert wurden".

Ich weiß nicht warum - aber als ich Addobserver in meiner Init -Methode hatte und in meiner Overalloc -Methode REMEBERVERVERVERVERVERSCHAFT - wurde immer noch die Nachricht erhalten, dass die KVO immer noch beobachtet wurde. Ich trat durch und verifizierte, dass mein REMEDOBSERVER korrekt angerufen wurde.

Ich habe meinen Addobserver stattdessen in die ViewDidload -Methode verschoben, und das schien zu funktionieren.

Ich habe in ViewDIdunload einen Removalobserver hinterlassen und in Overloc; Aber das gefällt mir nicht, weil es nicht ausgeglichen ist. Aber unter normalen Umständen wird meine ViewDidunload nicht aufgerufen - dies ist nur Schutz, falls ich eine geringe Speicherbenachrichtigung erhalte.

Aber ich kann potenziell in die Situation gelangen, in der ein niedriges Speicherereignis ins Spiel kommt. ViewDidunload wird aufgerufen. Wenn ich dann irgendwann danach Dealloc drücke (bevor ich erneut auf ViewDidload drücke), rufe ich REMETOBSERVER zweimal an!

Ich denke also, ich werde es einfach in meiner Ansicht und meinem Overloc behalten.

Ich weiß immer noch nicht, warum es nicht richtig funktioniert, wenn ich den Addobserver in meiner Init -Methode mache.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top