Eine Möglichkeit wäre die Implementierung einer eigenen benutzerdefinierten Zurück-Schaltfläche. Sie müssten Ihrer viewDidLoad-Methode den folgenden Code hinzufügen:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
AKTUALISIEREN:
Hier ist die Version für Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
UPDATE 2:
Hier ist die Version für Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Das Ersetzen der Schaltfläche durch eine benutzerdefinierte Schaltfläche, wie in einer anderen Antwort vorgeschlagen, ist möglicherweise keine gute Idee, da Sie das Standardverhalten und den Standardstil verlieren.
Eine weitere Option besteht darin, die viewWillDisappear- Methode auf dem View Controller zu implementieren und nach einer Eigenschaft mit dem Namen isMovingFromParentViewController zu suchen . Wenn diese Eigenschaft wahr ist, bedeutet dies, dass der View Controller verschwindet, weil er entfernt (gepoppt) wird.
Sollte ungefähr so aussehen:
In Kürze 4.2
quelle
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
wird ausgelöst, wenn Sie einen Anruf erhalten. Dies ist wahrscheinlich nicht das, was Sie wollen. Wahrscheinlich besser zu bedienenwillMove(toParentViewController:)
quelle
parent == nil
, wenn wir ziehen zurück in dieparent
SzeneDies konnte ich folgendermaßen erreichen:
Swift 3
Swift 4
Keine benutzerdefinierte Zurück-Taste erforderlich.
quelle
Ich habe diese (schnelle) Klasse erstellt, um eine Zurück-Schaltfläche genau wie die reguläre zu erstellen, einschließlich des Zurück-Pfeils. Es kann eine Schaltfläche mit normalem Text oder mit einem Bild erstellen.
Verwendung
CustomBackButtonClass
(Code zum Zeichnen des mit dem Sketch & Paintcode-Plugin erstellten Zurückpfeils)
SWIFT 3.0
quelle
Wenn Sie eine Zurück-Schaltfläche mit einem Zurück-Pfeil haben möchten, können Sie unten ein Bild und einen Code verwenden
backArrow.png [email protected] [email protected]
quelle
Wenn Sie verwenden,
navigationController
fügen Sie dasUINavigationControllerDelegate
Protokoll zur Klasse hinzu und fügen Sie die Delegatmethode wie folgt hinzu:Diese Methode wird immer dann aufgerufen, wenn der Navigationscontroller auf einen neuen Bildschirm wechselt. Wenn die Zurück-Taste gedrückt wurde, ist der neue Ansichts-Controller
ViewController
selbst.quelle
In Swift 5 und Xcode 10.2
Bitte fügen Sie kein benutzerdefiniertes Balkenschaltflächenelement hinzu. Verwenden Sie dieses Standardverhalten.
Keine Notwendigkeit für viewWillDisappear , keine Notwendigkeit für benutzerdefiniertes BarButtonItem etc ...
Es ist besser zu erkennen, wann der VC von seinem übergeordneten Element entfernt wird.
Verwenden Sie eine dieser beiden Funktionen
Wenn Sie das Standardverhalten der Zurück-Schaltfläche beenden möchten, fügen Sie ein benutzerdefiniertes BarButtonItem hinzu.
quelle
NEIN
override func willMove(toParentViewController parent: UIViewController?) { }
Dies wird auch dann aufgerufen, wenn Sie zu dem Ansichts-Controller wechseln , in dem Sie diese Methode überschreiben. In welcher überprüfen , ob die „
parent
“ istnil
nicht die keine genaue Art und Weise ist bewegter sicher sein wieder auf den richtigenUIViewController
. Um genau festzustellen, ob derUINavigationController
richtig zurück zum navigiertUIViewController
demjenigen , das dieses aktuelle Modell präsentiert, müssen Sie sich an das anpassenUINavigationControllerDelegate
Protokoll einhalten.JA
Hinweis:
MyViewController
ist nur der Name von was auch immerUIViewController
Sie zurückgehen möchten.1) Fügen Sie oben in Ihrer Datei hinzu
UINavigationControllerDelegate
.2) Fügen Sie Ihrer Klasse eine Eigenschaft hinzu, die den Überblick über die Eigenschaft behält, von der
UIViewController
Sie abweichen.3) in
MyViewController
'sviewDidLoad
Methodeself
als Delegat für Ihre zuweisenUINavigationController
.3) Weisen Sie vor dem Übergang die vorherige
UIViewController
als diese Eigenschaft zu.4) Und entsprechen einer Methode in
MyViewController
derUINavigationControllerDelegate
quelle
In meinem Fall hat das am
viewWillDisappear
besten funktioniert. In einigen Fällen muss jedoch der vorherige Ansichts-Controller geändert werden. Hier ist meine Lösung mit Zugriff auf den vorherigen Ansichts-Controller , die in Swift 4 funktioniert :quelle
Bevor ich den Stromregler verlasse, muss ich einen Alarm anzeigen. Also habe ich es so gemacht:
UINavigationController
mit hinzufügenUINavigationBarDelegate
Es hat funktioniert)
quelle
Es ist nicht schwer wie wir. Erstellen Sie einfach einen Rahmen für UIButton mit klarer Hintergrundfarbe, weisen Sie der Schaltfläche eine Aktion zu und platzieren Sie sie über der Zurück-Schaltfläche der Navigationsleiste. Und schließlich entfernen Sie den Knopf nach dem Gebrauch.
Hier ist der Swift 3-Beispielcode, der mit UIImage anstelle von UIButton erstellt wurde
Schreiben Sie den Code müssen ausgeführt werden
Entfernen Sie die Unteransicht, nachdem die Aktion ausgeführt wurde
quelle
Swift 4.2:
quelle
Swift 3:
quelle
Versuche dies .
Probieren Sie das auch an.
quelle
Steuerung + Ziehen Sie das Balkenelement einfach unter die Funktion. arbeite wie Charme
quelle
Sie können Unterklassen erstellen
UINavigationController
und überschreibenpopViewController(animated: Bool)
. Sie können dort nicht nur Code ausführen, sondern auch verhindern, dass der Benutzer vollständig zurückkehrt, z. B. um zum Speichern oder Verwerfen seiner aktuellen Arbeit aufzufordern.Beispielimplementierung, in der Sie eine
popHandler
festlegen können, die von Push-Controllern festgelegt / gelöscht wird.Und Beispielnutzung von einem Push-Controller, der nicht gespeicherte Arbeit verfolgt.
Als nette
interactivePopGestureRecognizer
Geste wird dies auch aufgerufen, wenn der Benutzer versucht, mit einer Wischgeste zurückzukehren.quelle
Das ist meine Lösung
In Ihrem View Controller können Sie wie folgt vorgehen:
quelle
Soweit ich weiß, möchten
array
Sie Ihre leeren, während Sie die Zurück-Taste drücken und zu Ihrer vorherigen wechselnViewController let
Ihre ,Array
die Sie geladen auf diesem Bildschirm istquelle
quelle
quelle
Für Swift 5 können wir überprüfen, ob die Ansicht verschwindet
quelle
Swift 5 __ Xcode 11.5
In meinem Fall wollte ich eine Animation erstellen und wenn sie fertig ist, gehe zurück. Eine Möglichkeit, die Standardaktion der Zurück-Schaltfläche zu überschreiben und Ihre benutzerdefinierte Aktion aufzurufen, ist folgende:
Sie können diese Methode auch einmal verwenden, um die Hierarchie der Navigationsleistenansicht zu untersuchen und die Indizes für den Zugriff auf die Ansicht _UIButtonBarButton abzurufen, in UIControl umzuwandeln, die Zielaktion zu entfernen und Ihre benutzerdefinierten Zielaktionen hinzuzufügen:
quelle
Ich habe dies erreicht, indem ich aufgerufen / überschrieben
viewWillDisappear
und dann auf den Stapel der folgendennavigationController
Art zugegriffen habe:quelle
So habe ich es für mein eigenes Problem gelöst
quelle
Hier ist die einfachste Swift 5-Lösung, bei der Sie keine benutzerdefinierte Zurück-Schaltfläche erstellen und auf die kostenlose Funktionalität der linken Taste von UINavigationController verzichten müssen.
Wie von Brandon A oben empfohlen, müssen Sie
UINavigationControllerDelegate
den View Controller, mit dem Sie interagieren möchten, implementieren, bevor Sie zu ihm zurückkehren. Eine gute Möglichkeit besteht darin, einen Abwicklungsbereich zu erstellen, den Sie manuell oder automatisch ausführen können, und denselben Code über eine benutzerdefinierte Schaltfläche oder die Schaltfläche "Zurück" wiederzuverwenden.Machen Sie Ihren View Controller von Interesse (denjenigen, zu dem Sie zurückkehren möchten) zu einem Delegaten des Navigationscontrollers in seiner
viewDidLoad
:Fügen Sie zweitens am Ende der Datei eine Erweiterung hinzu, die überschrieben wird
navigationController(willShow:animated:)
Da Ihre Frage a enthielt
UITableViewController
, habe ich eine Möglichkeit eingefügt, den Indexpfad der Zeile abzurufen, auf die der Benutzer getippt hat.quelle
Sie können in Ihrem Viewcontroller etwas wie tun
Um eine vollständige Antwort zu erhalten, verwenden Sie Erkennen, wenn die Zurück-Taste auf einer Navigationsleiste gedrückt wird
quelle