2015-03-25 5 views
4

Я знаю, как создать представление контейнера в iOS через раскадровку, но это не позволит мне иметь вид контейнера в ячейке просмотра коллекции. Я бы хотел, чтобы одна из ячеек загрузила другой контроллер в качестве контейнера. Как мне это сделать?программно создать представление контейнера в ios

+0

Hey popeye, в основном, когда вы пытаетесь перетащить контейнерный вид в раскадровке в ячейку просмотра коллекции, компилятор говорит, что вы не можете использовать повторно используемую ячейку с контейнером – moger777

+0

Как это связано с тем, что я только что спросил? – Popeye

ответ

10

Прежде чем я дам вам код, вы должны понимать, что это, безусловно, плохая идея. UITableViewCells очень многоразовые и представляют собой просто необработанные представления, не поддерживаемые реальным контроллером представления (только источником данных). Контейнерные представления предназначены для вложенных контроллеров, а не только для размещения внутри UIView (например, ячейки таблицы). Но я отвлекся:

Вот документы Apple, относящиеся к container views (поиск вид контейнера).

В разделе Добавление и удаление ребенка:

// Adding a container view 
[self addChildViewController:content];     // 1 
content.view.frame = [self frameForContentController]; // 2 
[self.view addSubview:content.view]; 
[content didMoveToParentViewController:self];   // 3 

// Removing a container view 
[content willMoveToParentViewController:nil]; // 1 
[content.view removeFromSuperview];   // 2 
[content removeFromParentViewController];  // 3 

При настройке ячейки он, скорее всего, уже есть вид контейнера внутри него (от его предыдущей конфигурации). Поэтому, прежде чем добавлять новый, вы должны сначала попытаться повторно использовать то, что вы уже добавили. Но опять же, это решение на самом деле не рекомендуется, но вы уже должны знать, что, поскольку IB заблокировал вас от этого.

+0

Итак, теперь, используя представление коллекции, было бы лучше, если бы я просто сделал вид uiscroll с отдельными разделами, сделанными чуть более вручную (и статичными вместо повторного использования)? Я полагаю, что в этом случае я мог бы просто использовать вид контейнера из раскадровки – moger777

+0

@ moger777, да, это было бы отличным альтернативным решением. Вы тоже можете это сделать в раскадровке, но я скажу, что делать это в коде будет гораздо более универсальным. Например, если вы хотите переключить два «раздела» или добавить новый между двумя текущими. Для этого в раскадровке потребуется много обновлений ограничений. Выполнение этого кода, вероятно, просто потребует добавления нового элемента в массив (который зацикливается в коде, чтобы добавить все виды контейнеров в следующем порядке). – Firo

+0

Я немного смущен тем, что должно быть здесь currentClientView – moger777

Смежные вопросы