Ansicht von verschachtelten iOS-View-Controllern in der Ansicht von UIViewController?

88

Ist es in iOS normalerweise eine schlechte Programmierpraxis, die Ansicht eines verschachtelten View Controllers in der Ansicht von UIViewController zu haben? Angenommen, ich wollte eine Art interaktives Element, das auf Berührungen des Benutzers reagiert, aber nur etwa 25% des Bildschirms einnimmt.

Ich nehme an, ich würde diesen verschachtelten Ansichts-Controller zu meinem UIViewController hinzufügen, indem ich Folgendes sage:

[self.view addSubview: nestedViewController.view];
Skyler
quelle
6
Hier ist ein vollständiges Tutorial mit vielen Bildern !! stackoverflow.com/a/23403979/294884 Viel Spaß
Fattie

Antworten:

145

Nein, dies ist im Allgemeinen ein gutes Design. Es hilft, Ihre View Controller präzise zu halten. Sie sollten jedoch das Containment-Muster des View Controllers verwenden. Lesen Sie die folgende Dokumentation.

Implementieren eines Container View Controllers

Dies ist unglaublich einfach mit Interface Builder mit Storyboards einzurichten. Sehen Sie sich die Containeransicht in der Objektbibliothek an.

Hier ist ein erfundenes Beispiel in einem Storyboard. In diesem Beispiel hätten Sie 4 Ansichts-Controller, einen mit den 3 Containern und einen für jeden Container. Wenn Sie den Controller ganz links mit allen Containern anzeigen, initialisiert das Storyboard automatisch die anderen 3. Sie können über die childViewControllersEigenschaft auf diese untergeordneten Ansichtscontroller zugreifen, oder es gibt eine Methode, mit der Sie die Zielansichtscontroller überschreiben prepareForSegue:sender:und erfassen können der Segue wird gleich gerufen. Dies ist auch ein guter Punkt, um bei Bedarf Eigenschaften an die untergeordneten Ansichtscontroller zu übergeben.

Geben Sie hier die Bildbeschreibung ein

Chris Wagner
quelle
40
Wie "zum Teufel" machst du das im Storyboard?! Es ist eine grundlegende Frage. Ich kenne die Antwort auf :) Seufz - Beantworte meine eigene Frage. Fügen Sie der Szene einen Container hinzu . Forme es. Erstellen Sie dann auf den leeren Feldern des Storyboards einen UIViewController. Ziehen Sie dann mit der rechten Maustaste von diesem Container (entweder in der Navigator-Liste oder in der GUI) auf diesen neuen UIViewController. Wählen Sie im Popup viewDidLoad-embedded aus, um loszulegen. Danke Chris! :)
Fattie
Die Verbindung ist übrigens unterbrochen.
Benjohn
2
@JoeBlow +1 "viewDidLoad-embedded" Heilige Kuh: wer hätte das gedacht!
Drux
Danke @ChrisWagner! Dies ist ein wichtiger Teil des Puzzles für die Implementierung der MVVM-Architektur und die Vermeidung von Massive View Controller / "MVC";)
Rob
54

Ich habe diesen Code in den übergeordneten Ansichts-Controller eingefügt. Es funktioniert großartig für mich.

Obj C.

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Eine andere Option ist die Verwendung von IB und die Containeransicht. UIViewController wird automatisch angezeigt (in diesem Fall XCode 9): Geben Sie hier die Bildbeschreibung ein

Maciej
quelle
2
Ja! +1. Vielen Dank für die Beantwortung einer programmatischen
Vorgehensweise
Ich habe nur die Ansicht vom untergeordneten Ansichts-Controller in die Liste der übergeordneten Unteransicht gezogen.
Dimpiax
5

Hier ist meine Swift 3-Lösung, die auf der Antwort von Swift Developers On FB basiert

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Rajat Jain
quelle