Перегляд вкладених контролерів перегляду iOS у поданні UIViewController?


90

Чи зазвичай це погана практика програмування в iOS, коли в поданні UIViewController є вид вкладеного контролера подання? Скажімо, наприклад, я хотів мати якийсь інтерактивний елемент, який реагує на дотики користувача, але займає лише 25% екрану.

Припускаю, що я б додав цей вкладений контролер подання до свого UIViewController, сказавши щось на зразок:

[self.view addSubview: nestedViewController.view];

6
Ось повний підручник з безліччю фотографій !! stackoverflow.com/a/23403979/294884 Насолоджуйся
Fattie

Відповіді:


148

Ні, це загалом хороший дизайн, він допомагає зберегти стислість ваших контролерів перегляду. Однак ви повинні використовувати шаблон утримання контролера перегляду, погляньте на наступну документацію.

Впровадження контролера подання контейнера

Це неймовірно просто налаштувати за допомогою Interface Builder і з Storyboards, погляньте на Container View в бібліотеці об’єктів.

Ось надуманий приклад в Раскадровці. У цьому прикладі у вас буде 4 контролери перегляду, один, який вміщує 3 контейнери, і по одному для кожного контейнера. Коли ви представляєте самий лівий контролер, який містить усі контейнери, Раскадровка автоматично ініціалізується та вбудовує інші 3. Ви можете отримати доступ до цих контролерів дочірнього перегляду через childViewControllersвластивість, або є метод, який можна замінити prepareForSegue:sender:та захопити контролери подання призначення сегу, яку збираються викликати. Це також хороший момент для передачі властивостей контролерам дочірнього перегляду, якщо такі потрібні.

введіть тут опис зображення


42
як "на біса" ти робиш це в раскадровці ?! це основне питання .. Я не знаю відповіді на :) Зітхання - відповідаючи на власне запитання. Додайте контейнер на сцену. Сформуйте його. Потім на порожніх полях розкадровки зробіть UIViewController. Потім клацніть правою кнопкою миші та перетягніть із цього контейнера (або у списку Навігатора, або в графічному інтерфейсі) до цього нового UIViewController. У спливаючому вікні виберіть viewDidLoad-embed, щоб розпочати. Дякую Крісе! :)
Fattie

До речі, посилання порушено.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed" Свята корова: хто б про це здогадався!
Drux

Дякую @ChrisWagner! Це найважливіша частина головоломки для реалізації архітектури MVVM та уникнення Massive View Controller / "MVC";)
Роб

54

Я помістив цей код у батьківський контролер подання. Для мене це чудово працює.

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

Стрімкий :

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

Іншим варіантом є використання IB та розміщення перегляду контейнера. UIViewController відобразиться автоматично (у цьому випадку XCode 9): введіть тут опис зображення


2
Так! +1. Дякуємо, що включили відповідь, як це робити програмно :)
C. Tewalt

Я просто перетягнув перегляд з контролера дочірнього перегляду в список батьківського підвиду.
dimpiax

5

Ось моє рішення Swift 3, засноване на відповіді розробників Swift On FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.