2013-03-02 5 views
8

Situation: zwei UITabBarControllers, jede mit ihren eigenen Registerkarten, aber die letzte Registerkarte in beide ist identisch, so wollen eine UIViewController Inhalt zeigen.Zwei UITabBarControllers, die einen ViewController teilen (als Tab-Inhalt)?

Problem zur Laufzeit: Gemeinsame Element erscheint nur in eine der Registerkarte setzt wenn angezeigt.

Frage: kennt jemand einen Weg, um dies zu arbeiten?

Link zu externer Grafik von Storyboard-Setup: (sorry, nicht genug Ruf Bilder hier zu schreiben!) Storyboard graphic

Ein Xcode-Projekt mit dem Storyboard: XCode Project

Jedes Element Registerkarte Inhalt hat seine eigene UIViewController-Klasse. Sie enthalten keinen Code außer der Zeile, damit die Zurück-Schaltflächen funktionieren.

(Ja, ich weiß, das ist seltsam. Wirkliche Situation ist eine iPad-App, wo Tab-Controller in Popovers angezeigt werden; Popovers sind "Property-Editoren", wo verschiedene Objekte unterschiedliche Eigenschaften haben, aber alle einen gemeinsamen Satz von Eigenschaften haben. Also eine Registerkarte für "einzigartige" Requisiten, eine gemeinsame Registerkarte Inhalt für die "gemeinsame" Requisiten alle Objekte haben.)

Ich habe ein paar Wege um dies zu bekommen, um den Effekt, den ich will, aber wenn dieses Storyboard arbeitete es wäre eine viel einfachere Lösung.

- Weitere Informationen, etwas in keinem Zusammenhang mit Frage -

Alternative Lösung Ich verwende: TabBarControllers nur auf einen VC Link als Registerkarte Inhalt. Wenn diese Registerkarte VC lädt, verwende ich Code, um (a) freigegebene VC vom Storyboard nach Bezeichner zu instantiieren, (b) das neue VC-Objekt über [tabController setViewControllers: list animated: NO] zum TabBarController hinzuzufügen.

(Eine andere mögliche Lösung Ich mag noch weniger:.. Keine TabBarController verwenden und präsentieren Inhalt VC mit meinem eigenen „Tab“ Grafik in ihnen gezogen, die jeweils zeigen, „ich selbst“, wie ausgewählte Yuk)

Also ich habe eine funktionierende Lösung, ich bin nur neugierig, warum das nicht funktioniert (nur eine bekannte Sache in iOS-API, oder einige magische Eigenschaft Einstellung, die es funktionsfähig machen könnte?)

+0

Beachten Sie ähnliche Frage mit einem anderen Fokus (seltsame Dinge gehen dort mit Tabellen und wiederverwendet Ansichten und so ...): http://StackOverflow.com/Questions/8620619/uitabbarController-Storyboard-connecting-viewcontroller- thats-schon-connecte? rq = 1 –

+0

Ich bin mir nicht sicher, was Sie erreichen möchten. Ihre Lösung, bei der Sie die zweite Registerkarte im Code hinzufügen, kann im Storyboard ausgeführt werden, indem Sie einfach den freigegebenen Controller kopieren und eine Instanz an jeden Tab-Controller anschließen. In beiden Szenarien erhalten Sie zwei verschiedene Instanzen des "freigegebenen" Controllers. – rdelmar

+0

Was ich versuche zu erreichen, ist nicht das UI-Layout in mehreren Kopien der "one" Storyboard-Szene zu bearbeiten, wenn ich entscheide, dass es eine andere Hintergrundfarbe und ein anderes Tastenlayout haben muss. In diesem Beispiel gäbe es nur zwei Kopien. In meiner eigentlichen App wird es wahrscheinlich 10+ geben, daher der Wunsch zu teilen. Ich wollte vermeiden, dass die Benutzeroberfläche in .XIB-Dateien ausgelagert und von dort geladen wird, wofür Storyboards gedacht sind. –

Antwort

0

Sie können nicht gleich setzen Betrachten Sie die Controller-Instanz in zwei Registerkarten. Das Problem besteht darin, dass eine View-Instanz (UIView) nur eine übergeordnete Ansicht haben kann (superview). Wenn Sie versuchen, den Ansichtscontroller zur zweiten Registerkarte hinzuzufügen, wird die Ansicht des Ansichtscontrollers von der ersten übergeordnet (die erste Registerkarte) entfernt und dann zur zweiten Registerkarte hinzugefügt.

+0

Ich stimme nicht zu, aber ich bin mir nicht sicher, dass das die Ursache des Problems ist. Die gesamte TabBarController-Schaltfläche wird nicht mehr angezeigt. Der zweite ViewController wird niemals im ViewControllers-Array des zweiten TabBarControllers festgelegt. Es stimmt zwar, dass [view addSubview: sub] bewirkt, dass das Sub-Objekt als Nebeneffekt aus einer vorhandenen übergeordneten Ansicht entfernt wird. Das Problem scheint jedoch komplexer zu sein. Ich möchte eine Bestätigung erhalten, dass die Storyboard-Implementierung von Apple nicht in der Lage ist, zwei Instanzen des SharedViewControllers automatisch zu instanziieren (zwei View-Objekte erstellen). –

+0

Außerdem: Es wird jeweils nur ein TabBarController zur Verfügung gestellt. Warum kann also nicht jeder die einzige Instanz des SharedViewControllers nutzen? Ich stimme zu, dass es Probleme mit der Ansicht an zwei Stellen gleichzeitig geben würde, aber das ist hier nicht der Fall, es sei denn, die API enthält den gesamten ViewController-Satz für das Storyboard im Speicher, wenn er nicht angezeigt wird. Es scheint nicht wichtig zu sein, welchen TabBarController Sie als Erstes zeigen, es ist also nicht so, als ob Sie ihm zeigen, dass es die Kontrolle über die Ansicht übernimmt und die zweite Präsentation später die Ansicht aus der Hierarchie einer anderen Person ergreift. Tab wird * nie * im zweiten TBController angezeigt. –

0

Ich bin über Ihren Thread gestolpert, während ich heute in dasselbe Problem gelaufen bin ... Die Lösung besteht darin, ein Duplikat des View Controllers im Storyboard zu erstellen und das Duplikat an den anderen Tab Bar Controller anzuhängen. Ich habe es einfach gemacht und es funktioniert ... Ich denke, der 'rdelmar' hat Recht damit ... kopiere es und setze es .. !!

+3

Dadurch entsteht ein Albtraum, ein Dutzend Kopien der Storyboard-Szene jedes Mal zu aktualisieren, wenn Sie ein Layout ändern möchten. Duplikate und die Verwendung identischer - aber eindeutiger Kopien an mehreren Stellen lassen den Programmierer in mir einfach ein bisschen aufkeimen ... :-) –

0

Ich lief heute über das gleiche Problem. Ich schaffte es, eine Workaround zu finden, die den Trick zu machen scheint. Der Schlüssel besteht darin, eine Trennungsschicht zwischen der Registerkarte und dem Controller hinzuzufügen, den Sie wiederverwenden möchten. Von jeder Registerkarte habe ich eine Beziehung zu einem eindeutigen UIViewController mit einer Containeransicht erstellt.Dann können Sie einen 'Einbettungs'-Übergang vom Container zum Controller durchführen, den Sie tatsächlich als Registerkartenansicht verwenden möchten. Es ist nicht so sauber wie eine direkte Verbindung (nicht sicher, warum das nicht unterstützt wird), da Sie für jeden Wiederverwendungsfall eine Controller-Klasse erstellen müssen. Es ist immer noch eine bessere Lösung als der Albtraum, die tatsächliche Registerkartenansicht (sowie alle zusätzlichen Ansichten, die sich damit verbinden) für jede Verwendung duplizieren zu müssen.

Hoffe, das hilft. Lassen Sie mich wissen, wenn jemand mehr Details benötigt.

+0

Ich bin offensichtlich weitergegangen (und bin mit der Duplizierung weitergegangen) aber ich denke deine Lösung würde funktionieren ... vorausgesetzt, Sie können mehrere "eingehende" Ebed-Segmente für einen Content-View-Controller haben. Sie haben Recht, dass es weniger direkt ist, und erzeugt einen Schmerz, weil der Tab-Controller nicht direkt auf seinen Inhalt verweisen kann (was der Container-View-Controller wäre). Aber offensichtlich hat niemand eine bessere Lösung gepostet ... :-) –

Verwandte Themen