Aktion für Zurück-Schaltfläche im Navigationscontroller einstellen

170

Ich versuche, die Standardaktion der Zurück-Schaltfläche in einem Navigationscontroller zu überschreiben. Ich habe einem Ziel eine Aktion auf der benutzerdefinierten Schaltfläche zur Verfügung gestellt. Die seltsame Sache ist, wenn es durch das Backbutton-Attribut zugewiesen wird, beachtet es sie nicht und es öffnet nur die aktuelle Ansicht und geht zurück zur Wurzel:

%Vor%

Sobald ich es durch das leftBarButtonItem auf dem navigationItem setze, ruft es meine Aktion auf, aber dann sieht die Schaltfläche wie eine einfache runde statt der pfeilförmig zurück:

%Vor%

Wie kann ich meine benutzerdefinierte Aktion aufrufen, bevor ich zur Stammansicht zurückkehre? Gibt es eine Möglichkeit, die Standard-Back-Aktion zu überschreiben, oder gibt es eine Methode, die beim Verlassen einer View immer aufgerufen wird (ViewDidUnload tut das nicht)?

    
Parrots 31.07.2009, 21:21
quelle

27 Antworten

362

Versuchen Sie, dies in den View-Controller zu legen, wo Sie die Taste drücken möchten:

%Vor%     
William Jockusch 10.08.2010 04:20
quelle
167

Ich habe die Erweiterung UIViewController-BackButtonHandler implementiert. Es muss nichts von Unterklassen abgeleitet werden, einfach in Ihr Projekt einfügen und navigationShouldPopOnBackButton Methode in UIViewController klasse überschreiben:

%Vor%

Beispielanwendung herunterladen .

    
onegray 02.10.2013 08:28
quelle
42

Anders als Amagrammer gesagt hat, ist es möglich. Sie müssen Ihre navigationController ableiten. Ich habe hier alles erklärt (einschließlich Beispielcode): Ссылка

    
HansPinckaers 28.11.2009 13:43
quelle
13

Schnelle Version:

(von Ссылка )

In Ihrem View-Controller passen Sie sich einfach an ein Protokoll an und führen alle erforderlichen Aktionen aus:

%Vor%

Dann erstellen Sie eine Klasse, sagen Sie NavigationController+BackButton , und kopieren Sie einfach den folgenden Code:

%Vor%     
kgaidis 17.12.2015 20:12
quelle
6

Es ist nicht möglich, direkt zu tun. Es gibt ein paar Alternativen:

  1. Erstellen Sie Ihre eigene benutzerdefinierte UIBarButtonItem , die beim Antippen validiert und bei einem Testdurchlauf
  2. platzt
  3. Überprüfen Sie den Inhalt des Formularfelds mithilfe einer UITextField -Delegatenmethode, z. B. -textFieldShouldReturn: , das aufgerufen wird, nachdem die Schaltfläche Return oder Done auf der Tastatur gedrückt wurde

Der Nachteil der ersten Option ist, dass der nach links zeigende Pfeilstil der Zurück-Schaltfläche nicht über eine benutzerdefinierte Leiste erreicht werden kann. Sie müssen also ein Bild verwenden oder mit einem normalen Stil Knopf gehen.

Die zweite Option ist nett, weil Sie das Textfeld in der Delegate-Methode zurückgeben, sodass Sie Ihre Validierungslogik auf das bestimmte Textfeld ausrichten können, das an die Delegaten-Rückrufmethode gesendet wird.

    
Alex Reynolds 25.05.2010 19:58
quelle
5

Für einige Threading-Gründe war die von @HansPinckaers erwähnte Lösung nicht richtig für mich, aber ich fand eine sehr einfache Möglichkeit, eine Berührung auf dem Zurück-Knopf zu bekommen, und ich möchte dies hier festhalten, um Stunden zu vermeiden von Täuschungen für jemand anderen. Der Trick ist wirklich einfach: Fügen Sie Ihrer UINavigationBar einfach eine transparente UIButton als Unteransicht hinzu und setzen Sie Ihre Selektoren so, als wäre es die echte Schaltfläche! Hier ist ein Beispiel mit Monotouch und C #, aber die Übersetzung zu objective-c sollte nicht zu schwer zu finden sein.

%Vor%

Fun fact: zu Testzwecken und um gute Abmessungen für meinen gefälschten Button zu finden, setze ich die Hintergrundfarbe auf Blau ... Und es zeigt hinter den Zurück-Button! Wie auch immer, es fängt immer noch jede Berührung ein, die auf den ursprünglichen Knopf zielt.

    
psycho 06.07.2011 23:46
quelle
3

Mit dieser Technik können Sie den Text der "Zurück" -Schaltfläche ändern, ohne den Titel eines der View-Controller zu beeinflussen, oder den Text der Zurück-Schaltfläche während der Animation ändern.

Fügen Sie dies der init-Methode im aufrufenden View-Controller hinzu:

%Vor%     
Jason Moore 23.07.2010 01:36
quelle
3

Es wurde eine Lösung gefunden, bei der auch der Stil der Zurück-Schaltfläche erhalten bleibt. Fügen Sie Ihrem View-Controller die folgende Methode hinzu.

%Vor%

Stellen Sie nun in der folgenden Methode eine Funktionalität bereit:

%Vor%

Alles was es tut ist, die Zurück-Taste mit einer transparenten Taste zu verdecken;)

    
Sarasranglt 21.08.2015 11:13
quelle
2

Ich glaube nicht, dass dies leicht möglich ist. Der einzige Weg, den ich glaube, um dies zu umgehen, ist, Ihr eigenes Pfeil-Bild zu machen, um es dort zu platzieren. Es war zunächst frustrierend für mich, aber ich sehe, warum, um der Konsistenz willen, wurde es weggelassen.

Sie können sich schließen (ohne den Pfeil), indem Sie eine normale Schaltfläche erstellen und die standardmäßige Schaltfläche "Zurück" ausblenden:

%Vor%     
Meltemi 31.07.2009 23:08
quelle
2

Es gibt einen einfacheren Weg, indem Sie einfach die Methode delegate von UINavigationBar und überschreiben die Methode ShouldPopItem erstellen.

    
jazzyjef2002 27.08.2013 18:49
quelle
2

Einfachster Weg

Sie können die Delegate-Methoden des UINavigationControllers verwenden. Die Methode willShowViewController wird aufgerufen, wenn die Zurück-Taste Ihrer VC gedrückt wird.do was immer Sie wollen, wenn Sie zurück btn gedrückt haben

%Vor%     
Nepster 18.09.2014 11:31
quelle
2

Hier ist meine Swift-Lösung. Überschreiben Sie in Ihrer Unterklasse von UIViewController die navigationShouldPopOnBackButton-Methode.

%Vor%     
AutomatonTec 14.03.2015 22:12
quelle
2

onegray's Lösung ist nicht sicher. Laut den offiziellen Dokumenten von Apple, Ссылка , Das sollten wir vermeiden.

"Wenn der Name einer in einer Kategorie deklarierten Methode mit einer Methode in der ursprünglichen Klasse oder einer Methode in einer anderen Kategorie derselben Klasse (oder sogar einer übergeordneten Klasse) übereinstimmt, ist das Verhalten bezüglich der Methode undefiniert Die Implementierung wird zur Laufzeit verwendet. Dies ist weniger wahrscheinlich ein Problem, wenn Sie Kategorien mit Ihren eigenen Klassen verwenden, aber Probleme verursachen, wenn Sie Kategorien zu Standardcocoa oder Cocoa Touch-Klassen hinzufügen. "

    
user2612791 02.11.2015 06:02
quelle
2

Mit Swift:

%Vor%     
Murray Sagal 19.04.2016 02:51
quelle
2

Hier ist die Swift 3-Version der Antwort von @oneway , um das Ereignis in der Navigationsleiste zu erfassen, bevor es ausgelöst wird. Da UINavigationBarDelegate nicht für UIViewController verwendet werden kann, müssen Sie einen Delegaten erstellen, der ausgelöst wird, wenn navigationBar shouldPop aufgerufen wird.

%Vor%

Und dann fügt der Controller in Ihrer Ansicht die Delegate-Funktion hinzu:

%Vor%

Ich habe festgestellt, dass wir oft einen Alert-Controller hinzufügen möchten, damit die Benutzer entscheiden können, ob sie zurück wollen. Wenn dies der Fall ist, können Sie immer return false in navigationShouldPopOnBackButton() function eingeben und Ihren View-Controller schließen, indem Sie Folgendes tun:

%Vor%     
Lawliet 28.02.2017 10:21
quelle
1

Wenn Sie die Ziel- und Aktionsvariablen, die Sie gerade verlassen, auf Null setzen, sollten Sie in der Lage sein, Ihre Sicherungsdialoge so zu verkabeln, dass sie aufgerufen werden, wenn die Schaltfläche "ausgewählt" ist. Pass auf, das kann in seltsamen Momenten ausgelöst werden.

Ich stimme hauptsächlich mit Amagrammer überein, aber ich denke nicht, dass es so schwer wäre, den Button mit dem Pfeil custom zu erstellen. Ich würde einfach den Zurück-Button umbenennen, einen Screenshot machen, Photoshop die benötigte Buttongröße erstellen, und das wäre das Bild oben auf dem Button.

    
TahoeWolverine 27.07.2009 01:06
quelle
1

Sie können versuchen, auf die rechte Maustaste der NavigationBars-Schaltfläche zuzugreifen und die selector-Eigenschaft festzulegen ... here eine Referenz UIBarButtonItem Referenz , eine andere Sache, wenn diese Arbeit, die def arbeiten wird, ist, setzen Sie die rechte Schaltfläche Element der Navigationsleiste zu einem benutzerdefinierten UIBarButtonItem, das Sie erstellen und seinen Selektor setzen ... hoffe, das hilft

    
Daniel 25.05.2010 19:58
quelle
1

Für ein Formular, das Benutzereingaben wie diese benötigt, würde ich empfehlen, es als "modal" anstelle eines Teils Ihres Navigationsstapels aufzurufen. Auf diese Weise müssen sie sich um das Geschäft auf dem Formular kümmern, dann können Sie es validieren und es mit einer benutzerdefinierten Schaltfläche abweisen. Sie können sogar eine Navigationsleiste entwerfen, die genauso aussieht wie der Rest Ihrer App, aber mehr Kontrolle bietet.

    
Travis M. 08.11.2012 15:40
quelle
1

Zumindest in Xcode 5 gibt es eine einfache und ziemlich gute (nicht perfekte) Lösung. Ziehen Sie in IB ein Bar Button Item aus dem Utilities-Bereich und legen Sie es auf der linken Seite der Navigationsleiste ab, wo die Schaltfläche Zurück angezeigt wird. Setzen Sie die Beschriftung auf "Zurück". Sie haben eine funktionierende Schaltfläche, die Sie an Ihre IBAction binden und Ihren viewController schließen können. Ich mache etwas Arbeit und triggere dann ein Abwicklungssegment und es funktioniert perfekt.

Was nicht ideal ist, ist, dass diese Schaltfläche nicht die & lt; Pfeil und trägt nicht den vorherigen VC-Titel, aber ich denke, dass dies verwaltet werden kann. Für meine Zwecke habe ich die neue Schaltfläche "Zurück" als Schaltfläche "Fertig" festgelegt, damit der Zweck klar ist.

Sie haben auch zwei Zurück-Schaltflächen im IB-Navigator, aber es ist einfach genug, sie aus Gründen der Übersichtlichkeit zu beschriften.

    
Dan Loughney 03.04.2014 15:42
quelle
1

Schnell

%Vor%     
zono 28.02.2015 17:22
quelle
1

Dieser Ansatz funktionierte für mich (aber die Schaltfläche "Zurück" hat kein "& lt;" -Zeichen):

%Vor%     
Ivan 01.05.2015 21:18
quelle
1

Die Antwort von @William ist korrekt. Wenn der Benutzer jedoch eine Swipe-to-Go-Back-Geste startet, wird die viewWillDisappear-Methode aufgerufen und selbst "self" wird nicht im Navigations-Stack sein (also self.navigationController) .viewControllers enthalten kein 'self'), auch wenn der Swipe nicht abgeschlossen ist und der View-Controller nicht wirklich geöffnet wird. Die Lösung wäre also:

  1. Deaktivieren Sie die Gestenzu-Zurück-Geste in viewDidAppear und erlauben Sie nur die Verwendung der Zurück-Schaltfläche, indem Sie:

    verwenden %Vor%
  2. Oder verwenden Sie stattdessen einfach viewDidDisappear wie folgt:

    %Vor%
boherna 26.01.2016 19:33
quelle
1

Verwenden Sie isMovingFromParentViewController

%Vor%     
herrk 27.05.2015 15:49
quelle
0

Um die Zurück-Schaltfläche abzufangen, decken Sie sie einfach mit einem transparenten UIControl ab und fangen Sie die Berührungen ab.

%Vor%     
Jeff 19.02.2013 09:46
quelle
0

Die Lösung, die ich bisher gefunden habe, ist nicht sehr nett, aber es funktioniert für mich. Bei dieser Antwort überprüfe ich auch, ob ich programmgesteuert poppe oder nicht:

%Vor%

Sie müssen diese Eigenschaft zu Ihrem Controller hinzufügen und sie auf YES setzen, bevor Sie sie programmgesteuert aufrufen:

%Vor%     
Ferran Maylinch 11.05.2015 11:07
quelle
0

Einen neuen Weg gefunden:

Ziel-C

%Vor%

Schnell

%Vor%     
Ashish Kakkad 14.07.2015 16:52
quelle
0

Schnelle Version von @ onegays Antwort

%Vor%

Passen Sie jetzt in jedem Controller einfach an RequestsNavigationPopVerification an, und dieses Verhalten wird standardmäßig übernommen.

    
Adam Waite 13.06.2016 13:29
quelle