Правильно ли "гнездовать" UIViewControllers внутри других UIViewControllers, как вы бы UIViews?

У меня есть довольно сложное представление, для меня, так или иначе, у которого есть несколько "лотков" с элементами пользовательского интерфейса на них. Они вставляются и выходят из моего корневого представления. Я хотел бы вложить (addSubview) элементы внутри представления. Каждый из них нуждается в некоторой настройке перед отображением... и никто не может быть настроен в IB (это подклассы UIView).

Мне интересно, имеет ли смысл подкласс UIViewController для каждого "лотка", а затем свойство VC view указывает на представление "лоток", которое я могу заполнить моими пользовательскими объектами UIView. Таким образом, я могу использовать методы viewDidLoad и т.д. В UIViewController.

Я не знаю, как другие делают это - по крайней мере, в нескольких образцах, на которые я смотрел. Это создаст ситуацию, когда одновременно будут отображаться несколько контроллеров представлений на экране. от самого контроллера навигации вниз до корневого контроллера и его вида, а затем любого числа (ну, разрешающего размер экрана) этих небольших лоток-мониторов. Если да, то как работает цепочка ответчиков? Я предполагаю, что он перейдет от самого низкого UIView к его вложенному VC, затем к этому родительскому представлению VC, затем к этому VC и т.д. и т.д. повторите, повторите.. до UIApplication... я прошу о проблемах?

ИЛИ, я просто придерживаюсь UIViews и добавляю subviews в subviews и т.д. и т.д.

Ответ 1

До iOS 5.0 это специально не рекомендуется, так как события жизненного цикла контроллеров вложенных представлений - viewWillAppear и т.д. - не будут вызываться. См. Нарушение UIViewControllers.

С несколькими представлениями UIViewControllers, видимыми сразу, некоторые из этих контроллеров могут не получать важные сообщения, такие как -viewWillAppear: или -didReceiveMemoryWarning. Кроме того, некоторые из их свойств, таких как parentViewController и interfaceOrientation, могут не устанавливаться или обновляться, как ожидалось.

iOS 5.0 добавил сдерживающий UIViewControllers, который правильно обрабатывает эти события жизненного цикла, добавляя контроллеры дочерних элементов.

- (void)addChildViewController:(UIViewController *)childController

Я потратил бесчисленные часы, пытаясь заставить вложенные контроллеры представлений работать в iOS 4. В конце концов я сделал это, но для этого потребовалось много кода для склеивания, что было легко ошибиться. Затем я увидел предупреждение в документах.

Ответ 2

Я пытаюсь сделать то же самое, но был отговорен от вашего подхода Apple documentation, в котором говорится, что "вы должны не использовать контроллеры представлений для управления представлениями, которые заполняют только часть их окна, то есть только часть области, определяемой прямоугольником содержимого приложения. Если вы хотите иметь интерфейс, состоящий из нескольких меньших видов, вставьте их все в один корневого представления и управлять этим представлением с помощью вашего контроллера представления."

Ответ 3

Мой опыт в том, что вы пытаетесь сделать, был хорошим. Я стараюсь, чтобы файлы nib были как можно более простыми, поэтому я беру любое возможное "subview" и инкапсулирую его в свой собственный файл nib с помощью собственного контроллера представления, поэтому в итоге у меня есть вложенные контроллеры представлений. В одном из моих приложений у меня очень сложная ячейка таблицы, у которой есть subview. Таким образом, у меня была иерархия, которая выглядит следующим образом: контроллер табличного представления на верхнем уровне, контроллеры tableviewcell для каждой строки и внутри каждого из них - подчиненный контроллер для подсмотра внутри каждой ячейки.

И все работает нормально.

Простите мой английский.