Widok zagnieżdżonych kontrolerów widoku iOS w widoku UIViewControllera?

90

Czy zazwyczaj zła praktyka programistyczna w systemie iOS ma widok zagnieżdżonego kontrolera widoku w widoku UIViewControllera? Załóżmy na przykład, że chciałem mieć jakiś element interaktywny, który reaguje na dotyk użytkownika, ale zajmuje tylko około 25% ekranu.

Przypuszczam, że dodałbym ten zagnieżdżony kontroler widoku do mojego UIViewController, mówiąc coś takiego:

[self.view addSubview: nestedViewController.view];
Skyler
źródło
6
Oto pełny samouczek z dużą ilością zdjęć !! stackoverflow.com/a/23403979/294884 Enjoy
Fattie

Odpowiedzi:

148

Nie, to ogólnie dobry projekt, który pomaga zachować zwięzłość kontrolerów widoku. Jednak powinieneś używać wzorca kontrolera widoku, zapoznaj się z następującą dokumentacją.

Implementowanie kontrolera widoku kontenera

Jest to niezwykle proste w konfiguracji przy użyciu Interface Builder z scenorysami, spójrz na widok kontenera w bibliotece obiektów.

Oto wymyślony przykład w Storyboard. W tym przykładzie będziesz mieć 4 kontrolery widoku, jeden zawierający 3 kontenery i po jednym dla każdego kontenera. Kiedy zaprezentujesz najbardziej po lewej kontroler, który ma wszystkie kontenery, Storyboard automatycznie zainicjuje i osadzi inne 3. Możesz uzyskać dostęp do kontrolerów widoku podrzędnego poprzez childViewControllerswłaściwość lub istnieje metoda, którą możesz zastąpić prepareForSegue:sender:i przechwycić kontrolery widoku docelowego ścieżka, która ma zostać wywołana. Jest to również dobry punkt do przekazywania właściwości do kontrolerów widoku podrzędnego, jeśli są potrzebne.

wprowadź opis obrazu tutaj

Chris Wagner
źródło
42
jak do diabła robisz to w scenorysie ?! to podstawowe pytanie… nie znam odpowiedzi :) Ech - odpowiadając na własne pytanie. Dodaj kontener do sceny. Kształtuj to. Następnie w pustych polach scenorysu utwórz UIViewController. Następnie kliknij prawym przyciskiem myszy i przeciągnij z tego kontenera (na liście Nawigatora lub w interfejsie GUI) do tego nowego UIViewController. Z wyskakującego okienka wybierz opcję viewDidLoad-embedded, aby rozpocząć. Dzięki Chris! :)
Fattie
Nawiasem mówiąc, łącze jest zerwane.
Benjohn
2
@JoeBlow +1 "viewDidLoad-embed" Święta krowa: kto by się tego domyślił!
Drux
Dzięki @ChrisWagner! Jest to kluczowy element układanki przy implementacji architektury MVVM i unikaniu kontrolera Massive View Controller / „MVC”;)
Rob
54

Umieściłem ten kod w nadrzędnym kontrolerze widoku. Działa świetnie dla mnie.

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];
}

Szybki :

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

Inną opcją jest użycie IB i umieszczenie widoku kontenera. UIViewController pojawi się automatycznie (w tym przypadku XCode 9): wprowadź opis obrazu tutaj

Maciej
źródło
2
Tak! +1. Dzięki za
dołączenie
Po prostu przeciągnij i upuść widok z kontrolera widoku podrzędnego na listę widoku podrzędnego nadrzędnego.
dimpiax
5

Oto moje rozwiązanie Swift 3 oparte na odpowiedzi Swift Developers On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Rajat Jain
źródło