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];
ios
uiviewcontroller
viewcontroller
Skyler
źródło
źródło
Odpowiedzi:
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
childViewControllers
wł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.źródło
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):
źródło
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)
źródło