Ich habe eine Anwendung, in der ich eine Ansicht vom Stapel eines UINavigationControllers entfernen und durch eine andere ersetzen muss. Die Situation ist, dass die erste Ansicht ein bearbeitbares Element erstellt und sich dann durch einen Editor für das Element ersetzt. Wenn ich die offensichtliche Lösung in der ersten Ansicht mache:
MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];
[self retain];
[self.navigationController popViewControllerAnimated: NO];
[self.navigationController pushViewController: mevc animated: YES];
[self release];
Ich bekomme sehr seltsames Verhalten. Normalerweise wird die Editoransicht angezeigt, aber wenn ich versuche, die Schaltfläche "Zurück" in der Navigationsleiste zu verwenden, werden zusätzliche Bildschirme angezeigt, von denen einige leer und andere nur vermasselt sind. Der Titel wird auch zufällig. Es ist, als ob der Navigationsstapel vollständig abgespritzt ist.
Was wäre ein besserer Ansatz für dieses Problem?
Danke, Matt
quelle
Der folgende Ansatz erscheint mir netter und funktioniert auch gut mit ARC:
quelle
if(indexPath.row == 0){UIViewController *newVC = [[UIViewController alloc] init];newVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Item1VC"]; NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[_detailViewController.navigationController viewControllers]]; [viewControllers removeLastObject];[viewControllers addObject:newVC]; [_detailViewController.navigationController setViewControllers:viewControllers animated:YES];}
Aus Erfahrung müssen Sie
viewControllers
direkt mit der Eigenschaft des UINavigationController herumspielen . So etwas sollte funktionieren:Hinweis: Ich habe die Aufbewahrung / Freigabe in eine Aufbewahrung / Autorelease geändert, da dies im Allgemeinen nur robuster ist. Wenn zwischen der Aufbewahrung / Freigabe eine Ausnahme auftritt, lecken Sie sich selbst, aber die Autorelease kümmert sich darum.
quelle
Nach viel Mühe (und dem Optimieren des Codes von Kevin) habe ich endlich herausgefunden, wie das im View Controller geht, der vom Stapel genommen wird. Das Problem, das ich hatte, war, dass self.navigationController null zurückgab, nachdem ich das letzte Objekt aus dem Controller-Array entfernt hatte. Ich denke, es lag an dieser Zeile in der Dokumentation für UIViewController zur Instanzmethode navigationController. "Gibt einen Navigationscontroller nur zurück, wenn sich der View-Controller in seinem Stapel befindet."
Ich denke, sobald der aktuelle Ansichts-Controller vom Stapel entfernt ist, gibt seine navigationController-Methode null zurück.
Hier ist der angepasste Code, der funktioniert:
quelle
Danke, das war genau das, was ich brauchte. Ich habe dies auch in eine Animation eingefügt, um die Seitenkräuselung zu erhalten:
Die Dauer von 0,6 ist schnell, gut für 3GS und neuer, 0,8 ist für 3G immer noch etwas zu schnell.
Johan
quelle
Wenn Sie einen anderen View Controller von popToRootViewController anzeigen möchten, müssen Sie folgende Schritte ausführen:
Jetzt wird der gesamte vorherige Stapel entfernt und ein neuer Stapel mit dem erforderlichen rootViewController erstellt.
quelle
Ich musste kürzlich etwas Ähnliches tun und meine Lösung auf Michaels Antwort basieren. In meinem Fall musste ich zwei View Controller aus dem Navigationsstapel entfernen und dann einen neuen View Controller hinzufügen. Berufung
zweimal, hat in meinem Fall gut funktioniert.quelle
Diese
UINavigationController
Instanzmethode könnte funktionieren ...Pops View Controller, bis der angegebene View Controller der Top View Controller ist, und aktualisiert dann die Anzeige.
quelle
Hier ist ein weiterer Ansatz, bei dem nicht direkt mit dem viewControllers-Array herumgespielt werden muss. Überprüfen Sie, ob der Controller bereits geöffnet wurde, und drücken Sie ihn, wenn dies der Fall ist.
quelle
quelle
Am liebsten mache ich das mit einer Kategorie auf UINavigationController. Folgendes sollte funktionieren:
UINavigationController + Helpers.h #import
UINavigationController + Helpers.m
#import "UINavigationController + Helpers.h"
Dann können Sie von Ihrem Ansichts-Controller aus die Draufsicht durch eine neue ersetzen, indem Sie Folgendes tun:
quelle
Sie können mit dem Array der Navigationsansichts-Controller überprüfen, welches Sie Ihnen alle Ansichts-Controller geben, die Sie im Navigationsstapel hinzugefügt haben. Mit diesem Array können Sie zurück zu einem bestimmten Ansichts-Controller navigieren.
quelle
Für Monotouch / Xamarin IOS:
innerhalb der UISplitViewController-Klasse;
quelle
Alternative,
Sie können verwendet werden,
category
um zu vermeidenself.navigationController
seinnil
nachpopViewControllerAnimated
einfach pop and push, es ist leicht zu verstehen, muss nicht zugreifen
viewControllers
....In Ihrem ViewController
quelle
Nicht genau die Antwort, könnte aber in einigen Szenarien hilfreich sein (meine zum Beispiel):
Wenn Sie den Viewcontroller C öffnen und zu B (außerhalb des Stapels) anstatt zu A (der eine unter C) wechseln müssen, können Sie B vor C drücken und alle 3 auf dem Stapel haben. Indem Sie den B-Push unsichtbar halten und auswählen, ob nur C oder C und B insgesamt eingeblendet werden sollen, können Sie den gleichen Effekt erzielen.
anfängliches Problem A -> C (Ich möchte C platzen lassen und B aus dem Stapel zeigen)
mögliche Lösung A -> B (unsichtbar gedrückt) -> C (wenn ich C platziere, entscheide ich mich, B anzuzeigen oder es auch zu platzen)
quelle
Ich benutze diese Lösung, um die Animation zu behalten.
quelle