Verwenden mehrerer Storyboards mit einem TabBarController

8

Okay, bei der Entwicklung meiner neuesten App habe ich festgestellt, dass mein storyboard sehr groß geworden ist, also habe ich es in multiple storyboards aufgeteilt, bevor es außer Kontrolle gerät. nur für Einstellungen allein habe ich etwa 20 tableviewcontrollers , die von einem root NavigationController abzweigen. Das navigationcontroller war ein TabItem auf einem TabBarController , was der application's Root-View-Controller ist.

Ich habe die TabBar in ihre eigene StoryBoard als Root_Storyboard verschoben und der Navigations-Controller ist nun die erste Ansicht der Settings_Storyboard.

Nur zu Testzwecken habe ich ein paar UIViewControllers als Tab-Elemente in das TabBarController (Root_Storyboard) und das untergeordnete gesetzt und den folgenden Code zu seiner viewWillAppear -Methode hinzugefügt. Es funktioniert gut, aber ich weiß, dass das presentViewController das NavigationController modal anzeigt und das tabBar ausblendet. Offensichtlich will ich das nicht, wie bekomme ich es richtig zu schieben, damit das TabBar sichtbar bleibt?

%Vor%

Bearbeiten - Um zu klären. Der obige Code ist die Unterklasse-Methode für ein UIViewController (child of UITabBarController:index(1)) in der Root_iPhone.storyboard. Die UINavigationController/UITableViewController , die ich zu laden versuche, findet sich in Settings_iPhone.storyboard . Ich bin mir nicht sicher, wie ich die in dieser Situation vorgeschlagene LinkView implementieren soll.

    
Hawk_Pilot 06.01.2014, 05:57
quelle

4 Antworten

10

Dies ist durchaus möglich und ein kluger Schachzug - das Entschlüsseln Ihrer Storyboards bietet sauberere Schnittstellendateien zum Durchforsten, reduzierte Ladezeiten in XCode und bessere Gruppenbearbeitung.

Ich habe schon eine Weile über Stack Overflow hinweg gekämmt und bemerkt, dass jeder auf Custom Segues zurückgreift oder tabbasierte Setups programmatisch instanziiert. Huch. Ich habe eine einfache UIViewController-Unterklasse zusammengehackt, die Sie als Platzhalter für Ihre Storyboards verwenden können.

Code:

Header-Datei:

%Vor%

Implementierungsdatei:

%Vor%

Beschreibung:

  1. Der View-Controller verwendet seinen Wiederherstellungsbezeichner, um ein Storyboard in Ihrem Projekt zu erstellen.
  2. Einmal geladen, versucht es sich selbst zu ersetzen Array viewController des UINavigationControllers mit dem Storyboard Anfangsansicht-Controller.
  3. Wenn angefordert, gibt diese Unterklasse das UINavigationItem des ersten View-Controllers des Storyboards zurück. Dies stellt sicher, dass Navigationspunkte, die in UINavigationBars geladen werden, den Ansichtscontrollern nach dem Austausch entsprechen.

Verwendung:

Um es zu verwenden, weisen Sie es als Unterklasse eines UIViewController in Ihrem Storyboard zu, das zu einem UINavigationController gehört.

Weisen Sie ihm eine Wiederherstellungs-ID zu und Sie können loslegen.

Einrichtung:

Und so richten Sie es im Storyboard ein:

Dieses Setup zeigt einen Tab-Controller mit Navigations-Controllern als ersten Tab-Controller. Jeder Navigations-Controller hat einen einfachen UIViewController als Root-View-Controller (ich habe UIImageViews zu den Platzhaltern hinzugefügt, damit Sie leicht merken können, wozu er verlinkt ist). Jede von ihnen ist eine Unterklasse von TVStoryboardViewController. Jeder hat eine Wiederherstellungs-ID, die auf das Storyboard gesetzt ist, mit dem er verlinken soll.

Einige gewinnen hier:

  • Es scheint am besten für modale Präsentationen zu funktionieren, wo die Unterklasse der Root-View-Controller eines Navigationscontrollers ist.
  • Die Unterklasse drückt keine Controller auf dem Stack - sie tauscht aus. Das bedeutet, dass Sie eine Zurück-Schaltfläche nicht manuell ausblenden oder das Verhalten der Registerkarte an anderer Stelle außer Kraft setzen müssen.
  • Wenn Sie auf einen Tab doppeltippen, gelangen Sie erwartungsgemäß zur ursprünglichen Ansicht des Storyboards (diesen Platzhalter sehen Sie nicht mehr).
  • Sehr einfach einzurichten - keine benutzerdefinierten Segmente oder mehrere Unterklassen festlegen.
  • Sie können den Platzhalter-View-Controllern UIImageViews und was auch immer Sie möchten hinzufügen, um Ihre Storyboards klarer zu machen - sie werden niemals angezeigt.

Einige Einschränkungen:

  • Diese Unterklasse muss zu einem UINavigationController irgendwo in der Kette gehören.
  • Diese Unterklasse wird nur den ersten View-Controller im Storyboard instanziieren. Wenn Sie einen View-Controller weiter unten in der Kette instanziieren möchten, können Sie Ihre Storyboards immer weiter aufteilen und diesen Unterklassentrick erneut anwenden.
  • Dieser Ansatz funktioniert nicht gut, wenn View-Controller gedrückt werden.
  • Dieser Ansatz funktioniert nicht gut, wenn er als integrierter View-Controller verwendet wird.
  • Die Weitergabe von Nachrichten über Weiterleitungen wird wahrscheinlich nicht funktionieren. Dieser Ansatz ist für Setups geeignet, bei denen Abschnitte der Schnittstelle eindeutige, nicht verwandte Abschnitte sind (modal oder über die Tableiste).

Dieser Ansatz wurde gehackt, um dieses UITabBarController-Problem zu lösen, also verwenden Sie es als Teillösung für ein größeres Problem. Ich hoffe, dass Apple die Unterstützung für mehrere Storyboards verbessert. Für den UITabBarController Setup sollte es jedoch ein Leckerbissen funktionieren.

    
Thomas Verbeek 17.07.2014 06:37
quelle
5

Nicht sicher, ob Ihre Frage beantwortet wurde, und für andere, die nach einer Lösung für dieses Problem suchen, versuchen Sie diese Methode.

  1. Erstellen Sie den Tab-Bar-Controller mit Navigations-Controllern in einer Storyboard-Datei. Und fügen Sie einen leeren View-Controller (ich nannte es RedirectViewController) wie im Bild gezeigt.
  2. Der Child-View-Controller (wir nennen ihn SettingsViewController für Ihren Fall) befindet sich in Settings_iPhone.storyboard.
  3. In RedirectViewController.m codieren Sie dies:

    %Vor%
  4. SettingsViewController wird sofort angezeigt, wenn die Registerkarte Einstellungen berührt wird.
  5. Die Lösung ist noch nicht vollständig! Sie sehen "& lt; Zurück" als das linke Navigationselement auf SettingsViewController. Verwenden Sie die folgende Zeile in der viewDidLoad -Methode:

    %Vor%
  6. Um zu verhindern, dass das gleiche Registerkartenelement angetippt wird und ein Sprung zurück zum leeren rootViewController erfolgt, müssen die Zielansichts-Controller UITabBarControllerDelegate implementieren

    %Vor%

Es funktioniert für mich.

    
Rick 28.03.2014 15:22
quelle
5

Dies ist ein bisschen spät für Hawke_Pilot, aber es könnte anderen helfen.

Ab iOS 9.0 können Sie eine Beziehung zu einem anderen Storyboard erstellen. Dies bedeutet, dass Tab-Bar-View-Controller mit View-Controllern auf einem anderen Storyboard verknüpft werden können, ohne dass einige der verwirrenden Tricks in den anderen Antworten angezeigt werden. : -)

Dies allein hilft jedoch nicht, da der Empfänger im anderen Storyboard nicht weiß, dass er mit einem Tab Bar View Controller verbunden ist und die Tab-Leiste nicht zur Bearbeitung anzeigt. Alles, was Sie tun müssen, wenn Sie den Storyboard-Verweis auf den gewünschten View-Controller richten, wählen Sie den Storyboard-Verweis und dann Editor- & gt; Einbetten- & gt; Navigations-Controller. Dies bedeutet, dass der Nav Controller weiß, dass er mit einem Tab Bar View Controller verbunden ist, da er sich auf demselben Storyboard befindet und unten die Tab-Leiste anzeigt und die Bearbeitung von Button-Bild und Titel erlaubt. Kein Code erforderlich.

Zugegebenermaßen mag dies nicht für jeden geeignet sein, kann aber für das OP funktionieren.

    
RowanPD 22.06.2016 16:38
quelle
2

Fügen Sie folgenden Code zu Ihrem LinkViewController

hinzu %Vor%

Hier ist der Screenshot für LinkViewController .

LinkViewController ist nur ein Platzhalter, an dem ein neuer viewController platziert wird. Hier ist der Beispielcode, den ich für meine App verwendet habe.

RBStoryboardLink . Es funktioniert großartig für mich. Lass es mich wissen, wenn es für dich hilfreich ist.

    
Prince Agrawal 06.01.2014 06:04
quelle