Разумно ли «вкладывать» UIViewControllers в другие UIViewControllers так же, как UIViews? - PullRequest
27 голосов
/ 17 июля 2009

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 25 февраля 2012

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

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

Добавлена ​​iOS 5.0 Содержит UIViewControllers , который корректно обрабатывает эти события жизненного цикла, добавляя дочерние контроллеры представления.

- (void)addChildViewController:(UIViewController *)childController

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

7 голосов
/ 13 августа 2009

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

1 голос
/ 17 июля 2009

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

И все отлично работает.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...