Ich habe eine Reihe von drei View-Controller, von denen die ersten beiden in einem UINavigationController verpackt sind, und werden von der Standard-Main.storyboard
-Datei verwaltet. Nennen wir sie A
bzw. B
. Ich habe mehr View-Controller in der Datei, die jeweils instanziiert und verwaltet werden, obwohl ich daran arbeite, sie in All-Code-Lösungen zu verschieben. Der oben erwähnte dritte Sichtcontroller, den ich bereits im Code (C
) habe, ist einer, der zu verschiedenen Zeiten instanziiert und von B
dargestellt wird.Gibt es eine Möglichkeit, ein Abwicklungssegment programmgesteuert zu erstellen und zu verwenden?
A
und B
haben eine normale Einstellung der Schnittstellenbeziehung in Interface Builder und werden per Code aufgerufen. Ich mache das gleiche mit C
von B
, über Code (instanziieren und presentViewController(_:)
). Es gibt ein paar Fälle, in denen eine Aktion in C
B
'raison d'être ungültig macht, und daher muss ich beide ablehnen.
Bisher habe ich dismissViewControllerAnimated(_:)
von C
angerufen, und dann in B
‚s viewDidAppear(_:)
prüft wird, ob sie entlassen werden sollen, und es auf die gleiche Weise, wenn so zu entlassen. Während dieses Vorgangs wird der Benutzer durch die VC-Hierarchie zurückgeworfen und sieht zu, wie leere Ansichten dorthin zurückfliegen, wo sie hergekommen sind. So haben sie Zeit, mit Steuerelementen zu experimentieren, die nicht mehr funktionieren, und können die App zum Absturz bringen. Dies ist eine ziemlich beunruhigende Benutzererfahrung, die ich abschaffen möchte. Ich könnte einfach alles deaktivieren, aber das ist eine Menge Kontrollen, die ich lieber nicht mit Unordnung, wenn ich es vermeiden könnte ...
Ich verstehe, dass IB unterstützt "Abwicklungssegmente", die eine gesamte VC-Hierarchie gleichzeitig entlassen kann , obwohl diese nur View-Controller im Storyboard zu handhaben scheinen. Gibt es eine Möglichkeit, dieses Verhalten (alles A
) programmgesteuert zu entfernen, ohne viel von der Arbeit, die ich bereits getan habe, zurückzugeben, wenn man bedenkt, dass ein Teil meiner Hierarchie in einem UINavigationController
enthalten ist?
UPDATE:
Also, ich habe die Entlassung richtig zu arbeiten, durch einen Verweis auf die präsentierenden Ansicht vorbei und ruft seine segue entlassen vor der Abreise. Dieser Ansatz kam mit seinen eigenen Problemen und der seltsamen Navigation des Navigationscontrollers, aber mit einigen Feinabstimmungen könnte er brauchbar sein.
Ehrlich gesagt, wäre es viel einfacher, das Feature vollständig zu diesem Zeitpunkt zu entfernen, da es vor allem eine Bequemlichkeit ist.
Um der Wissenschaft willen bleibe ich dabei, bis ich mich für den Weg des Äthers entscheide und antworte hier für jeden, der auf diese Weise googelt.
UPDATE:
Ew ... Es scheint, dieser Code war älter als ich dachte. Ich habe tatsächlich zwei Navigationssteuerungen, um eine benutzerdefinierte modale Animation in und aus B
mit einem benutzerdefinierten Abwicklungsabschnitt dort zu unterstützen (dort gehen Sie). Um die gewünschte Animation zu erhalten, kann ich auch C
in das Storyboard werfen und ein benutzerdefiniertes Abwicklungssegment erstellen.
Wenn mir Animation egal ist, einfach die Animation auf der benutzerdefinierten Abwickelfunktion deaktivieren, haben sowohl B
als auch C
sofort und zusammen verschwinden lassen. Das Problem ist, es ist ein bisschen aufregend für meinen Geschmack ...
vacawama ‚s Vorschlag tatsächlich macht sehr viel Sinn, und dient mir direkt für die Dokumentation nicht überprüft! UIViewController
enthält bereits einen Verweis auf presentingViewController
. Um zwei zurückzukommen ist eine Prise, einfach die Hierarchie zurück zu klettern und die zu verwerfen, die ich will. Funktioniert wie ein Charme, ohne Animation passiert gar nicht ...
Ich werde hier bald eine Antwort mit dem, was ich bisher gefunden habe, posten.
Sie können nicht segues, normal oder abwickeln, ohne ein Storyboard. Da Sie einen Navigationscontroller haben, können Sie seine Eigenschaft 'viewControllers' direkt manipulieren – Paulw11
" obwohl ich arbeite sie in All-Code-Lösungen zu bewegen "... Warum machst du das? Es macht das Projekt nur schwieriger zu warten und du machst mehr Arbeit als nötig. – Rob
@ Paulw11 Das ist etwas, über das ich nachgedacht habe, aber ich hatte noch keine Gelegenheit, es selbst zu versuchen ... Würde ich nur einen Hinweis auf den Nav-Controller geben, wenn ich 'C' präsentiere? Ich werde es jetzt versuchen und zurück mit dem, was ich finde. – SeizeTheDay