Der Xcode 6 Interface Builder verfügt standardmäßig über das neue Kontrollkästchen "Größenklassen verwenden". Es macht Ansichten anpassungsfähig.
Wenn ich versuche, zwischen zwei Ansichten in meinem Storyboard zu wechseln, habe ich neue Optionen:
stattdessen alt:
Jetzt haben wir "zeigen" und "modal präsentieren" anstelle von "pushen" und "modal". Die alten Optionen werden als veraltet markiert. Ich habe die Option "show" gewählt, weil sie in den Segue-Einstellungen "show" (z. B. push) heißt.
Aber es macht keinen Schub. Die Segue-Animation sieht aus wie eine Folie von unten (modal) und die Navigationsleiste verschwindet.
Die Frage ist: Wie kann ich "Show" wie Push funktionieren lassen? Ist es möglich oder sollte ich stattdessen "push (veraltet)" verwenden? Wo finde ich Informationen zu neuen Arten von Segues? Das einzige, was ich in der iOS8-Entwicklerbibliothek gefunden habe, sind Storyboards, die Ihnen beim Entwerfen Ihrer Benutzeroberfläche helfen, aber es gibt keine Informationen zu "show" segue.
AKTUALISIEREN
Ich habe versucht, ein neues Projekt zu erstellen und "show" funktioniert wirklich wie "push". Ich denke, das Problem in meinem Projekt kann sein, dass ich den Navigationscontroller mit diesem Code wiederverwenden kann, aber ich weiß nicht, wie ich ihn beheben soll.
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
Danach versuche ich, NewViewController nach MainViewController zu pushen
UPDATE 2:
Ich scheine nur iOS 7, iOS 7.1 Problem zu sein.
quelle
Es gibt bereits eine akzeptierte Antwort, aber ich wollte ein bisschen mehr Informationen geben, möglicherweise Informationen, die vorher nicht verfügbar waren.
Wie bereits erwähnt, waren die Segmente "Push" und "Modal" veraltet und wurden durch "Show" bzw. "Modal Present" ersetzt. Laut Apples Dokumentation wurden die neuen Segmente weiter in Segmente unterteilt, die sich an Größenklassen anpassen. Die älteren sollten nur zur Unterstützung von iOS-Versionen verwendet werden, die älter als iOS 8 sind.
Das Dokument im folgenden Link erklärt dies und die Beschreibung aller verfügbaren alten und neuen Segmente.
Hinzufügen eines Segues zwischen Szenen in einem Storyboard
Falls sich die URL in Zukunft ändert, ist dies die Erklärung für jeden neuen Abschnitt:
quelle
An den anderen Antworten ist nichts auszusetzen, aber hier wird erklärt, was passiert, wie Sie überprüfen können, ob es passiert, und wie Sie das Problem in Zukunft beheben können.
Hintergrund
In meinem Fall funktionierte keiner meiner Show Segues, obwohl ich bereits einen UINavigationController als anfänglichen Ansichtscontroller hatte (mit meinem Inhalt UIViewController als Root).
Warum und wie der Show-Segue bricht
Der Show-Segue wird unterbrochen, wenn eine Aktion mit dem Segue in der Quell-XML des Storyboards verknüpft ist. Ein typisches Szenario, das dies verursacht, könnte sein, wenn Sie einen Abschnitt von einem manuellen Abschnitt neu definiert haben, der zuvor im Code aufgerufen wurde. Dadurch bleiben die folgenden Bits in der Storyboard-XML.
Um benutzerdefinierte Aktionen bei Verwendung des Segues aus dem Storyboard zu berücksichtigen, können Sie einfach auf prepareForSegue tippen, den Controller für die Zielansicht abfangen und von diesem Speicherort aus beliebige Methoden aufrufen. In jedem Fall ist der Nebeneffekt für diesen kleinen Fehler (der Fehler ist die Tatsache, dass wenn Sie den Segue neu definieren, er nicht richtig in xml eingerichtet ist ~ dh die Aktion bleibt auch nach dem Ändern des Segues in einen, der von einem UIView (oder) aus ausgeführt wird, bestehen UIControl) an einen Target View Controller).
Leider schlägt die direkteste Lösung fehl. Wenn Sie also nur das XML-Attribut für die Aktion aus dem Storyboard entfernen, wird das Problem NICHT behoben. Stattdessen muss man einfach den Segue im Storyboard löschen und neu erstellen .
Nach der Neuerstellung hat die Storyboard-XML keine Aktion mehr, die dem jeweiligen Abschnitt zugeordnet ist, und die Show wird als Push ausgeführt.
Beispiel-XML für den korrekten Show Segue
Minderung
Um Wiederholungen zu vermeiden, müssen Sie sich nach Möglichkeit nur an nicht manuelle Storyboard-Abschnitte halten, indem Sie mit prepareForSegue die erforderlichen Aktionen basierend auf dem Zielansichts-Controller hinzufügen. Wenn Sie mischen und anpassen müssen, stellen Sie sicher, dass in Ihren Show-Segmenten keine Aktionen in der Storyboard-XML enthalten sind. Wenn Sie mit älteren Projekten arbeiten, sollten Sie dem Storyboard-Quellcode besondere Aufmerksamkeit widmen, da ich einige Probleme entdeckt habe.
quelle
Wie Scott Robertson hier kommentierte , sieht dies wie ein Fehler in iOS 7 aus.
Es scheint, dass in iOS 8 der Übergang zur Laufzeit abgeleitet wird (korrektes Verhalten), während in iOS 7 der Übergang zur Entwurfszeit abgeleitet wird (fehlerhaftes Verhalten).
Die einfachste Problemumgehung besteht darin, dem Storyboard einen nicht verwendeten Navigationscontroller hinzuzufügen und ihn zu verknüpfen, sodass der betreffende Ansichtscontroller Teil dieses Navigationscontrollers ist. Sie müssen den Navigationscontroller nicht instanziieren, sondern nur den fehlerhaften Ansichtscontroller, um zu wissen, dass er in einen Navigationscontroller eingebettet ist.
Hinweis: Die Simulation einer Navigationsleiste reicht für diese Zwecke nicht aus. Sie müssen tatsächlich einen Navigationscontroller in seinem Push-Stack haben.
So reproduzieren Sie den Fehler:
initWithRootViewController:
Methode in einen Navigations-Controller ein .So beheben Sie den Fehler:
workaround for show segues in iOS 7
).Beachten Sie, wie der Navigationscontroller im zweiten Bild hinzugefügt wurde und keine eingehenden Pfeile enthält (dh es gibt keine andere Möglichkeit, ihn zu instanziieren, als seine View Controller-ID zu verwenden).
quelle
Ich weiß, dass ich zu spät komme, aber ich wollte mitteilen, was ich gelernt habe. Dies ist in der Tat ein Fehler und ist noch heute (18.12.2014) vorhanden.
Ich schrieb einen Artikel darüber hier .
Es ist leicht reproduzierbar; unter iOS8 funktioniert einwandfrei und sogar unter iOS7.x, solange Sie einen View Controller nicht programmgesteuert in den Stapel schieben, bevor Sie den
Show
Segue aufrufen .Wenn Sie nur über Storyboard-Verbindungen auf den Stapel pushen, funktioniert dies. aber anscheinend wenn man per code irgendwie das drückt
navigationController
Eigenschaft des PuschsUIViewController
seinnil
und wenn Sie es aufrufenShow
, wird es ein Modal annehmen, weil es keine Navigation gibt, um den Stapel zu steuern.Die einzige bisherige Problemumgehung besteht darin, entweder nicht per Code zu pushen (nicht durchführbar) oder die jetzt veraltete zu verwenden
Push
.Ich habe ein Radar eingereicht (Link zum Artikel). Fühlen Sie sich frei, Duplikate einzureichen, in der Hoffnung, dass Apple dieses Problem behebt.
quelle
Show
führe ich einen Segue durch, dann wird der zweiteShow
Segue modal dargestellt: Lösung?Show
ViewController unter iOS 7 auszuführenIch hatte das gleiche Problem mit Segues in Xcode 7 und iOS 7.1.2. Show Segues (neue Funktion von iOS 8) funktioniert wie modale Segues in iOS 7 und ermöglicht es Ihnen nicht, Ihre View Controller in den Navigationscontroller-Stack zu verschieben, wenn Sie den Segue-Typ mit Xcode in Ihrem Storyboard definieren. Aus diesem Grund gibt Ihr self.navigationController null zurück, da der View Controller nicht auf den Stapel verschoben wurde und Sie ihn nicht einfügen können.
Ich verstehe nicht, warum Apple in Xcode keine Benachrichtigungen für diesen Fall hinzugefügt hat, wenn Ihre App für iOS 7 erforderlich ist. Die Push-Methode ist veraltet, aber Show funktioniert mit iOS 7 nicht richtig.
Was habe ich getan, um das Problem zu beheben:
Ich habe die MYShowSegue-Klasse mit .h erstellt
Und .m-Datei mit nur einer Perform- Methode:
Dann müssen Sie eine benutzerdefinierte festlegen für jeden Abschnitt in Ihrem Storyboard Typ und eine neue Klasse dafür auswählen, in meinem Fall war es MYShowSegue.
Beispiel für einen benutzerdefinierten Segue
Diese Lösung hilft Ihnen dabei, Ihre iOS 7-Apps vollständig zu unterstützen. Sie verwenden die pushViewController- Methode, um Ihre Ansichten zu pushen, und für iOS 8,9 usw. funktioniert Ihr Segue mit der neuen (iOS 8) -Methode showViewController
Vergessen Sie nicht, dasselbe mit all Ihren Abschnitten in Ihrem Storyboard zu tun.
quelle
Dies geschieht immer noch in iOS 10.x.
Das Löschen und Wiederherstellen von Segues hat für mich nichts gelöst:
Problem: Erforderliche Funktionalität waren 7 Segmente, die nur als "Push" (eigentlich ein Show-Detail) fungieren, aber tatsächlich würde nur das erste Segment, das ich hinzugefügt habe, pushen, die anderen würden sich alle modal verhalten. Dies geschieht, obwohl der Interface Builder die einzelnen Segmente identisch beschreibt.
Lösung: Ich musste die Aktion zu den 6 Abschnitten hinzufügen, die sie nicht hatten.
Original Storyboard XML
Ich habe dies geändert, indem ich showViewController: sender hinzugefügt habe
quelle