2016-07-25 25 views
1

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 CB '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.

+2

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

+0

" 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

+0

@ 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

Antwort

1

Also, Wissenschaft herrscht, und eine Lösung wird gefunden.

Es ist wirklich ein Schmerz zu tun, wenn Sie nicht gerne benutzerdefinierte Segues und Animatoren schreiben. Ich werde das irgendwann tun, aber im Moment ist es profitabler, das Feature überhaupt nicht zu aktivieren. (Gott sei Dank ist es einfach, auf mein Ende zu schalten).

Ich fand, dass meine entlassene segue (ich benutze eine benutzerdefinierte) auf B, dann entlassen C tat den Trick, solange ich keine Animationen für beide verwendet. Nichts unerwartetes dort überhaupt!

Ferner konnte ich den gleichen Effekt in einer Zeile erhalten (Animation spielt keine Rolle, so auch nicht benutzerdefinierte segue) durch Ausführen von:

presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil) 

von C ‚s äquivalent goAllTheWayBack().

Grob, aber es hat die Arbeit erledigt. Ein bisschen mehr Feinabstimmung, als würde man das Storyboard (ugh) für seine Abwicklungssequenz und das Schreiben eines benutzerdefinierten Animators verwenden, es würde schicker aussehen als ein Schwein in einer Decke!

Ich würde dieses Pferd gut und tot erklären. Danke allen!

0

Haben Sie Atomic Object's approach versucht

TL; DR

Verwendung IB und ctrl-drag 'C' View-Controller (gelb) auf 'Exit',

select 'prepareForUnwind',

geben Sie dem Abwicklungsabschnitt eine Kennung,

dann können Sie die Abwicklung pr durchführen Ogrammatisch und es wird "B" View Controller überspringen.

+0

Wie oben erwähnt, versuche ich, 'C' vorerst aus dem Storyboard herauszuhalten. Also nein, ich habe nicht versucht, in IB eine Abwicklungsstrecke dafür zu schaffen. – SeizeTheDay

+0

Ich habe das falsch gelesen und entschuldige mich für meinen Fehler. Ich denke, Segues sind nur mit IB verfügbar: http://StackOverflow.com/Questions/9674685/Creating-As-Gues-Programmatically – FullMetalFist

+0

Macht Sinn und keine Sorgen. Frage mich, ob es einen guten Weg gibt, all die Dinge einfach zu verwerfen ... – SeizeTheDay