4 Stimmen

UINavigationController abfangen - popViewControllerAnimated:

Also das Problem ist, dass, wenn jemand die Schaltfläche "Zurück" auf dem UINavigationControler berührt, ich möchte etwas Code ausführen, um die Datenquelle zu aktualisieren.

Das Problem ist, dass ich kippe scheinen, um den richtigen Delegaten zu finden, um es zu tun. nur diese sind verfügbar auf der Nav-Controller-Delegat, und ich möchte die 'didfinishshowing' Typ Methode.

– navigationController:willShowViewController:animated:  optional method  
– navigationController:didShowViewController:animated:  optional method  

Ich dachte, der nächstbeste Ort wäre die Navigationsleiste, aber wenn ich das versuche.

Beenden der Anwendung aufgrund von nicht gefangenen Ausnahme NSInternalInconsistencyException', Grund: 'Kann nicht manuell den Delegaten auf einer UINavigationBar, die von einem Controller verwaltet

Dies ist im Nachhinein sinnvoll, da man nicht möchte, dass ein Hacker an den Interna des Nav-Controllers herumpfuscht und ihn dadurch außer Betrieb setzt.

Das muss ein häufiges Problem sein, und ich habe etwas Einfaches übersehen.

10voto

Ramin Punkte 13326

Nur um das klarzustellen: Ansicht A ist der Startpunkt. Der Benutzer tippt auf etwas und Sie gleiten nach rechts zu Ansicht B. Der Benutzer tippt auf die Schaltfläche "Zurück" und Sie gehen von B zurück zu A und Sie möchten etwas als Ergebnis der "Zurück"-Aktion tun.

Es gibt drei Möglichkeiten, dies zu tun (und bei keiner müssen Sie in die Nähe des navigationControllers gehen - diese gelten für die zugrunde liegenden viewController selbst):

  • Wie dmercredi vorschlägt Override viewWillAppear auf View-Controller A, damit er sich selbst aktualisiert, wenn Sie zu ihm zurückkehren. Das Problem ist, dass viewWillAppear wird ebenfalls aufgerufen, wenn A das erste Mal aufgerufen wird. Sie müssen also eine Art Flag setzen, um zu unterscheiden zwischen dem ersten viewWillAppear und alle folgenden bei der Rückkehr von B.

  • Überschreiben Sie viewWillDisappear auf View-Controller B und aktualisieren Sie dort. Dies wird nur aufgerufen werden, wenn B ist im Begriff, weg zu gehen. Wenn es etwas auf B gibt, das eine Ebene tiefer geht oder einen modalen Dialog oben aufruft, viewWillDisappear wird angerufen werden, so dass man wieder zwischen dem Kommen und dem Gehen unterscheiden muss.

  • Entkoppeln Sie die verschiedenen Ansichten und verwenden Sie das Delegatenmuster. View-Controller A setzt sich selbst als Delegierter von B ein, und wenn B etwas aktualisiert, ruft er die Delegate-Methode auf, so dass A über die Änderung benachrichtigt wird und alles Notwendige aktualisieren kann. Sie können die Delegate-Methode jedes Mal aufrufen, wenn der Benutzer eine Änderung innerhalb von B vornimmt, oder die Delegate-Methode überschreiben. viewWillDisappear und machen Sie es nur einmal auf dem Weg nach draußen.

5voto

dmercredi Punkte 2092

Fügen Sie Ihren Refresh-Code in die viewWillAppear:(BOOL)animated-Methode auf dem View-Controller ein, der angezeigt werden soll. In Ihrem Fall ist das der View-Controller, der sich bereits auf dem Navigationsstapel befindet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X