Custom segue schieben einer bestimmten UIViewController zu UINavigationController
Ich möchte erstellen Sie eine custom segue das wirkt in der gleichen Weise wie die standard-push-segue tut, wenn verwendet, auf UINavigationController-view-Controller. Ich habe umgesetzt my custom segue:
CustomSegue.m
-(void)perform {
UIViewController *source = (UIViewController *)[self sourceViewController];
UIViewController *dest =(UIViewController *)[self destinationViewController];
if (1==2 //test) {
[source.navigationController pushViewController:dest animated:YES];
}
else {
UIViewController *altDest = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL]
instantiateViewControllerWithIdentifier:@"alternateView"];
[source.navigationController pushViewController:altDest animated:YES];
}
Wie Sie sehen können, der Grund, warum ich wollen, verwenden Sie eine benutzerdefinierte push-segue ist so, dass ich entscheiden kann, welche Ansicht-controller zu schieben, basierend auf der Benutzer-Konfiguration (derzeit nur die überprüfung einer trivialen 1==2-expression). Ich kann instanziieren des Alternative view-controller mit kein Problem, aber ich möchte in der Lage sein zu tun ist, gehen Sie zurück und her, ohne Neuladen der view-controller jedes mal (mit Hilfe der Schaltflächen zurück und weiter). Gibt es eine Möglichkeit, um eine vorhandene Instanz aus dem storyboard, oder einige standard-Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt eine custom segue mit seinen
perform
die Möglichkeit, das zu tun, was Sie beschreiben, D. H. wählen Sie in Echtzeit, ob ein pushdest
oderaltDest
ist entweder (1) nicht verwenden, leitet über auf allen und nur callpushViewController
direkt wie du hier tust, oder (2) bereiten Sie zwei leitet über die von der view-controller als ganzes, und rufen SieperformSegueWithIdentifier:
zu sagen, die sollten wir durchführen.Als für die direkt von
dest
zualtDest
können Sie pushaltDest
obendest
und entfernen Sie danndest
aus dem stack des navigation-Controllers view-Controller.Mag so viel über iOS, das ist alles so viel einfacher und offensichtlicher, wenn Sie nicht mit einem storyboard an alle. Das ist, warum ich nicht wie storyboards: Sie sind so einfältig und beschränkt, und Sie lenken die Aufmerksamkeit von der Art und Weise iOS wirklich funktioniert.
setViewControllers:animated:
. Sie können Sie neu anordnen, die bestehenden view-Controller und möglicherweise mehr hinzufügen view-Controller ist, entfernen Sie die vorhandenen view-Controller, etc., und führt es eine automatische animation (es sei denn, Sie sagen, es nicht zu). Sie könnten damit halten beide alternativen view-Controller in den stack, und nur zu halten, umgruppierungen.Gibt es keine Möglichkeit zum abrufen einer vorhandenen Regelung aus einer storyboard-es wäre schön, wenn es eine controllerWithIdentifier: Methode zu tun, aber es ist nicht. Leitet über (andere als abwicklern) immer instanziieren neuen Controller, also ich glaube nicht, Sie können tun, was Sie wollen mit einem segue. Wenn Sie möchten, zu gehen weiter (push), um den gleichen controller mehrmals, dann müssen Sie es im code durch die Schaffung einer Eigenschaft, die Punkte zu Ihrer Steuerung und überprüfung, wenn dieser controller vorhanden ist, bevor Sie es.
Als der andere haben darauf hingewiesen, Sie nicht verwenden können, ein segue zu drücken, um eine vorhandene Instanz eines Controllers. Den Prozess der Ausführung eines segue erstellt immer eine neue Instanz der Ziel-controller für Sie.
Persönlich, wenn ich springe zwischen den bestehenden Instanzen der view-Controller, denke ich, dass "container-view-controller", wie ein
UIPageViewController
, die macht es wirklich leicht, den übergang zwischen zwei oder mehr Controllern, ohne unbedingt reinstantiating Sie jedes mal.Wenn Sie nicht wie die Einschränkungen der page-view-controller auferlegt (z.B. vielleicht haben Sie nicht wie die Tatsache, dass iOS 5 version unterstützt nur Umblättern übergänge, oder, dass iOS 6 fügt nur die scroll-übergang, und Sie wollen etwas anderes), dann würde Sie eine benutzerdefinierte container-view-controller.
Beispielsweise, wenn ich wollte, zu springen zwischen zwei view-Controllern und nicht instanziieren Sie jedes mal, ich würde zunächst erstellen Sie eine benutzerdefinierte container-view-controller, die "Eltern", und sicherzustellen, dass ich eine Eigenschaft zu behalten, welches Kind ich bin derzeit bei:
Wenn die Unterstützung iOS 6.0 und höher nur, ich würde dann einen "container anzeigen", um meine Eltern view-controller-Szene. Wenn die Unterstützung iOS-Versionen vor 6.0, ich möchte hinzufügen eines standard -
UIView
zu der Szene und dann manuell instanziieren des ersten Kindes controller:Dann, wenn ich will, um den übergang zum zweiten Kind (oder den übergang zum ersten Kind), würde ich rufen Sie die folgende routine in die übergeordnete view-controller:
So, zum übergang zum zweiten Kind-view-controller, können Sie einfach anrufen:
Wenn Sie wollen, um den übergang zurück, könnten Sie rufen:
Bin ich nur an der Oberfläche kratzen hier, aber container-view-Controller (oder, wenn keine der standard-diejenigen die Arbeit machen, für die Sie eine benutzerdefinierte container-view-controller) ist genau das, was Sie brauchen.
Weitere Informationen finden Sie unter:
Erstellen Von Benutzerdefinierten Container View Controller in der View Controller Programming Guide for iOS.
Die Umsetzung UIViewController Containment in der WWDC 2011 Session Videos (Apple-Entwickler-ID erforderlich).
Die Implementierung einer Container-View-Controller in der UIViewController-Klasse Referenz.
Page-View-Controller in der View-Controller-Katalog für iOS.