2012-04-05 12 views
16

Ich erstelle eine benutzerdefinierte Containeransicht gemäß der apple spec. Ich würde gerne das Storyboard verwenden, um drei statische Kind UIViewControllers zu verbinden. Gibt es eine einfache Möglichkeit in das Storyboard über eine Relationship wie für den UINavigationController im Storyboard gesehen zu verbinden?Storyboards und benutzerdefinierte Container-View-Controller

NavigationController 'relationship'

Basierend auf meinen Recherchen scheint es so nicht möglich ist.

+1

Jede Freude? Ich wollte gerade die gleiche Frage stellen ... – jackslash

+0

Ich denke, das ist nicht möglich. Ich habe es unterlassen, benutzerdefinierte Container programmatisch einzurichten. – Stephen

+0

Ok, danke. Ich ging mit Xibs die altmodische Art für jetzt, in der Zukunft denke ich kranke Entwurfsgewohnheiten wie in Ihrem Artikel. – jackslash

Antwort

-1

Ich habe das nicht getan, aber es ist ein interessantes Problem. Haben Sie Ihre Child-View-Controller in Ihrem Container-Controller definiert, bevor Sie sie im Storyboard zugeordnet haben (Sie können dies tun - es wird kein Code angezeigt)? Aus der Dokumentation klingt es wie das ist, was Sie tun müssen - es kann sein, dass es nicht wie bei den generischen Klassen ist, wo Sie sie einfach ziehen können.

Damit für iOS Ereignisse ordnungsgemäß an Kind leiten View Controller und die Ansichten, die diese Controller verwalten, muss Ihr Containeransichtscontroller einen untergeordneten Ansichtscontroller mit sich selbst verknüpfen, bevor die Stammansicht des untergeordneten Elements der Ansichtshierarchie hinzugefügt wird.

Wie dem auch sei - eine Vermutung ...

+4

Das Problem, das ich habe, ist, dass Apple ermöglicht UITabBarController und UINavigationController, diese zu haben spezielle 'Relationship'-Eigenschaften, die benutzerdefinierte Objekte nicht haben. Ich habe Kinderansicht-Controller im Storyboard als Teil des Controller-Diagramms, aber keine Menge an cntl-Klick ermöglicht es mir, sie zu verkabeln. – Stephen

+0

Ist das nicht ein Fehler? – Ricardo

+2

Stephen - genau. Das einzige, was ich bei einer Vanilla-Containeransicht sehe, ist eine Option, genau einen anderen View-Controller einzubetten. Nur einer. Nicht zwei oder mehr. Das ist der Teil, der mich am Kopf kratzt. Es ist schließlich ein Container, also was nützt es, nur einen einzubetten? : \ –

0

Haben Sie versucht, die UITabBarController oder UINavigationController Subklassen?

Sie können Ihre benutzerdefinierte Klasse aus einer dieser Klassen erstellen und dann in Ihrem Storyboard festlegen, sodass Sie dieselben Beziehungen erstellen können. Dann können Sie die Registerkarte ausblenden und fügen Sie die gewünschte Funktionalität hinzu.

enter image description here

1

Sie können es Container Ansichten verwenden. Die Containeransicht erstellt automatisch eine Beziehung zum neuen Ansichtscontroller.

+0

OP fragt wie dann Verbinden Sie die Controller. – Fattie

+0

Wenn er die Containeransicht verwendet, wird der Controller automatisch verbunden. –

+0

Nein, ist es nicht. Probier es einfach. Es könnte sein, dass wir über verschiedene Dinge sprechen. Folgen Sie einfach den Anweisungen hier: http://stackoverflow.com/a/23403979/294884 der VIEW CONTROLLER ist in keiner Weise verfügbar. Sie müssen eine der beiden oben genannten Methoden verwenden. – Fattie

5

Es IS möglich, einen Container View Controller mit einem Kind zu verknüpfen. In der Tat ist es einfach, dies zu tun. Sie rufen die Objektbibliothek auf, geben "Container" in das Suchfeld ein und suchen nach dem Objekt "Containeransicht". Es sieht wie folgt aus:

enter image description here

Ziehen Sie einen Behälter Blick in die Inhaltsansicht des View-Controller.

Dann ziehen Sie die Strg-Taste aus der Containeransicht auf den anderen Ansichtscontroller, den die Containeransicht hosten soll. IB richtet einen "Embed-Segue" für Sie ein. Das eingebettete Segment wird aufgerufen, wenn die Inhaltsansicht des übergeordneten View-Controllers geladen wird. Das Einbettungssegment richtet die Eltern/Kind-Ansichten-Controller-Beziehung ein und führt die Organisation durch, die Sie benötigen. Es ist einfach und schmerzlos.

Ihre preparedForSegue-Methode wird für jeden eingebetteten Abschnitt aufgerufen. Sie können Ihren Einbettungssegmenten wie anderen Segmenten eindeutige Bezeichner zuweisen und dann mithilfe der Überleitungs-ID in prepareForSegue zusätzliche Einstellungen für den untergeordneten Ansichtscontroller vornehmen.

Sehen Sie sich dieses Projekt auf github an, das zeigt, wie eingebettete Segmente verwendet werden, um 2 statische UITableViewControllers in einem übergeordneten Element mithilfe von Containeransichten und eingebetteten Segmenten einzubinden. Dieses Projekt richtet benutzerdefinierte Protokolle ein, damit die übergeordneten und untergeordneten VCs miteinander kommunizieren können.In der prepareForSegue-Methode speichert der Parent Zeiger auf beide untergeordneten VCs und richtet sich selbst als Delegierte der beiden untergeordneten VCs ein, damit das untergeordnete Element wieder mit dem übergeordneten Element kommunizieren kann.

Sie können das Projekt unter diesem Link: https://github.com/DuncanMC/test

+1

Wer hat meine Antwort gewählt und warum? Wenn Sie meinen, dass meine Antwort falsch oder irgendwie schlecht ist, sagen Sie bitte, wo Sie meinen, dass meine Antwort fehlgeschlagen ist. –

+0

Hallo Duncan, Sie haben erklärt, wie Sie Containeransichten verwenden. Beachten Sie, dass Sie in Ihrem letzten Absatz sagen ** "die PrepareForSegue-Methode der Eltern speichert Zeiger auf beide untergeordneten VCs" **. Das ist der ganze Punkt dieser Frage. Beachten Sie, dass Sie das nicht auf dem Storyboard tun können - was lächerlich ist, Apple versaut. Wie Sie in Ihrem Demo-Projekt zeigen, müssen Sie es in Code tun. – Fattie

+0

Scheint nicht wie ein großes Problem für mich. Die PrepareForSegue-Methode ist ein sauberer und einfacher Ort, um Ihre Verbindungen zu verkabeln. Eine andere Möglichkeit ist, dass View-Controller eine parentViewController-Eigenschaft haben, die entweder null ist oder auf die übergeordneten Elemente einer VC verweist, und VCs auch eine childViewControllers-Eigenschaft besitzen, die ein Array der untergeordneten View-Controller-Child-Elemente enthält. Diese beiden Dinge geben Ihnen Zugriff auf Ihre Eltern und Kinder/Kinder, obwohl Sie, wenn Sie mehrere Kinder-View-Controller haben, eine Möglichkeit brauchen, sie zu unterscheiden. –