Zu einem anderen Storyboard wechseln?

133

Ist es möglich, von einem Storyboard zu einem anderen zu wechseln oder ein Storyboard in einen View Controller in einem anderen Storyboard einzubetten? Ich muss ein UITabBarControllerin ein setzen UINavigationController, und ich möchte sie schön und getrennt halten.

Ry-
quelle
1
Schauen Sie sich diese Antwort an stackoverflow.com/a/19702425/317928
vokilam
5
Gute Frage. Ein Storyboard zu haben ist ein Albtraum für teambasierte Projekte. Wir unterteilen Projekte regelmäßig nach "Flow" in Storyboards (ein Storyboard für die Anmeldung, ein Storyboard für Newsfeeds und zugehörige Bildschirme usw.). Dies hilft dabei, die Anzahl der Zusammenführungskonflikte zu minimieren, die andernfalls jedes Mal auftreten würden, wenn ein Entwickler das Storyboard berührt.
Brian Sachetta
@BrianSachetta Was machst du sonst noch? Gibt es noch andere gute ähnliche Tipps zum Teilen?
Honig
Das hängt von Ihrer Teamstruktur ab. Wenn Sie wirklich wollten, könnten Sie alle Ihre Benutzeroberflächen in separaten .xib-Dateien haben. So war es früher, bevor es Storyboards gab. Dieser Ansatz hat Vor- und Nachteile. Der Vorteil ist, dass Sie fast nie Konflikte mit anderen Entwicklern im Projekt haben werden. Der Nachteil ist, dass es schwierig sein kann, den App-Fluss visuell zu sehen.
Brian Sachetta

Antworten:

201

Ja, aber Sie müssen es programmgesteuert tun:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];
lnafziger
quelle
11
Ich möchte nur wirklich die Storyboards getrennt halten. Sie sind schon viel zu überladen.
Ry-
11
Genau wie in den Kapiteln eines Buches sehe ich die Notwendigkeit mehrerer Storyboards.
Finneycanhelp
48
Wenn mehrere Entwickler an derselben Anwendung arbeiten, ist es sehr nützlich, mehrere Storyboards zu haben, da das Lösen von Versionskontrollkonflikten in der Storyboard-XML manchmal sehr schmerzhaft ist.
Lee
14
In iOS 9 und Xcode 7 werden jetzt Cross-Storyboard-Referenzen unterstützt. :-)
Quinn Taylor
1
Siehe milczis Antwort, Sie können dies jetzt sehr einfach in der Benutzeroberfläche tun!
Tim
117

Ab Xcode 7 können Sie dies mithilfe einer Storyboard-Referenz grafisch ausführen:

Referenz

Fügen Sie Ihrem Storyboard eine Storyboard-Referenz hinzu. Erstellen Sie einen Übergang zwischen ViewController und Storyboard-Referenz (Strg + Ziehen).

Dann füllen Sie diese Felder aus.

Geben Sie hier die Bildbeschreibung ein

Wobei "Tutorial" die Datei "Tutorial.storyboard" und "MainTutorialController" Ihr Feld "Storyboard ID" in ViewControllerSettings ist

milczi
quelle
1
Gute Infos, jedoch ist die Frage mit ios5 gekennzeichnet, sodass dies nicht zutrifft.
lnafziger
10
@Inafziger ja, aber diese Frage wird oben in den Suchergebnissen für Benutzer von iOS 9 angezeigt
Brian Ogden
Dies ist ab XCode 7 verfügbar. Weitere Informationen finden Sie unter stackoverflow.com/questions/30772145/…
Simon Pickup
Dies hat funktioniert, aber ich muss auch die Navigationsleiste beibehalten. Sie wird ohne Navigationsleiste angezeigt. Gibt es eine Möglichkeit, eine Navigation und eine Schaltfläche beizubehalten, um sie wieder in den Verlauf zu verschieben, unabhängig davon, von welchem ​​Storyboard sie stammt?
Gil Beyruth
Dies funktioniert für mich in iOS 10. Ich habe festgestellt, dass ich eine Storyboard-Referenz pro Abschnitt benötige und nicht mehrere Abschnitte mit einem Referenzpunkt verbinden kann.
Mark Reid
10

Sie können Segues nicht wirklich manuell ausführen, da UIStoryboardSegue eine abstrakte Klasse ist. Sie müssen es unterklassifizieren und implementieren perform, damit es etwas tun kann. Sie sollen wirklich in Storyboards erstellt werden. Sie können den View Controller jedoch manuell drücken, was eine gute Lösung ist. Die Antwort von lnafziger macht das gut:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Eine Sache zu beachten ist jedoch, dass Sie gesagt haben, Sie möchten die Dinge schön und getrennt halten. Die Idee von Storyboards ist es, Ihnen zu ermöglichen, die Dinge getrennt zu halten, während Sie Ihre gesamte Designarbeit an einem Ort erledigen. Jeder View Controller ist nett und innerhalb des Storyboards von den anderen getrennt. Die ganze Idee ist, alles an einem Ort zu halten. Legen Sie es einfach schön an, damit es organisiert ist, und Sie können loslegen. Sie sollten es nicht trennen, es sei denn, Sie haben einen wirklich guten Grund dafür.

wbyoung
quelle
6
Das Zusammenführen von Storyboards funktioniert nicht sehr gut. In einer Umgebung mit mehreren Entwicklern kann es daher interessant sein, separate Storyboards zu verwenden. Auch die Leistung kann bei großen Projekten mit einem einzigen Storyboard ziemlich schlecht werden.
Calimarkus
1
Wir verwenden mehrere Storyboards, aber der Punkt ist, dass Sie das nicht wirklich tun und zwischen ihnen wechseln können. Apple hat es so konzipiert, dass Sie alles an einem Ort erledigen können. Die Idee ist also, nur einen zu verwenden (nicht, dass Sie das nicht können). Leistung sollte kein Problem sein. Das Storyboard wird für jeden View Controller in separate NIB-Dateien kompiliert. Storyboards sollten eine sehr gute Leistung bringen. Die Leistung ist genauso gut, als ob Sie für jeden View Controller separate xibs hätten.
wbyoung
3
In meinem Fall liegt das Leistungsproblem normalerweise bei Xcode ... Apples aktuelle Implementierung des Storyboard-Editors ist schwach.
Adam
1
Das Öffnen eines Storyboards mit 60 Szenen dauert auf einem Mac Pro 2014 13 Sekunden. Ich habe ein Radar eingereicht.
Robert Atkins
7

Sie sollten UITabBarController nicht in einem UINavigationController platzieren. Es wird nach Fehlern wie falscher Autorotation / Entladen von Ansichten usw. gefragt, da Apple diese Art der Eindämmung nicht unterstützt :

Bei der Kombination von Ansichtssteuerungen ist jedoch die Reihenfolge der Eindämmung wichtig. Es gelten nur bestimmte Vereinbarungen. Die Reihenfolge der Eindämmung vom Kind zum Elternteil ist wie folgt:

  • Controller für die Inhaltsansicht und Controller für die Containeransicht mit flexiblen Grenzen (z. B. der Controller für die Seitenansicht)
  • Controller für Navigationsansichten
  • Registerkartensteuerung
  • Split View Controller
Danra
quelle
1
Ich stimme vollkommen zu und aus mehreren Gründen. Das Einfügen eines TabBarControllers in einen NavigationController ist keine gute Idee, da die Delegaten für die darin enthaltenen Ansichten nicht korrekt ausgelöst werden und der Endbenutzer eine schreckliche Zeit beim Navigieren in der Benutzeroberfläche haben wird. Es würde ihnen schwer fallen, zu dem Controller zurückzukehren, der aus der TabBar / Navigation-Oberfläche herausführt. Umgekehrt ist OK, ein Navigationscontroller in einem TabBarController. Es ist immer am besten, den Endbenutzer nicht zu verwirren und sich die Vorschläge von Apples anzuhören!
Hubert Kunnemeyer
1
Und doch macht die native iPhone Music App genau das (Teil "Now Playing").
Enzo Tran
Zu Ihrer Information: Die iPhone-Musik-App verfügt nicht über TabbarController im Bildschirm "Aktuelle Wiedergabe".
Sanjana
4

Hier ist eine schnelle Version:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}
DudeOnRock
quelle
-1

Haben Sie Folgendes versucht:

2 / Klicken Sie, um Ihren Ansichts-Controller auszuwählen, der mit Ihrem Navigations-Controller und im oberen Menü verknüpft ist: Editor -> Einbetten in -> Registerkarten-Controller

Hinweis: Ich habe es nicht getestet, weil ich das Gegenteil verwende: Erstellen von Apps mit Registerkarten und Einfügen des Navigationscontrollers.

Moxy
quelle