Контроллер дочернего представления в UICollectionViewCell

Предположим, я хочу получить пин-страницу Pinterest, например:

Pinterest

Это мой подход:

  1. делать UICollectionViewControllerПин-страница является UICollectionViewCell
  2. ячейка состоит из двух компонентов: контактная информация дочерний vc && водопад дочерний vc

Тогда возникает проблема: как я могу использовать дочерний контроллер представления?

Некоторый псевдокод:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    Pin *pin = self.dataSource[indexPath.row];
    // i have to create a new childVC, based on different indexPath.
    UITableViewController *pinInfoViewController = [[pinInfoViewController alloc] initWithPin:pin];
    [cell updatePinViewWithPin:pin];
    [self addChildViewController:pinInfoViewController];

    // Add waterfall view controller
}

Каждый раз, когда вызывается этот метод, создается новый дочерний контроллер представления, это нормально или как его улучшить?

3 ответа

Решение

То, как я хотел бы подойти к этому, это подкласс UICollectionViewCell и добавьте необходимые компоненты пользовательского интерфейса в качестве iVars. Когда вам нужно обновить пользовательский интерфейс новыми данными, вы должны захватить объект ячейки, как вы сейчас находитесь в псевдокоде, а затем вызвать метод, который вы объявляете, может быть updateCellWithModel: и передайте ему модель, которая содержится в источнике данных. В этом методе вы выполняете несколько простых проверок того, созданы ли элементы пользовательского интерфейса или нет, и создаете их при необходимости, всегда полезно иметь проверки работоспособности в этих типах методов, но элементы должны быть созданы в методе init и будут всегда будь здесь.

РЕДАКТИРОВАТЬ: я думаю, что я ответил на ваш вопрос, но это все еще смущает меня, пожалуйста, добавьте больше информации, чтобы я мог редактировать свой ответ, если это необходимо.

Я недавно сталкивался с подобной ситуацией и изо всех сил пытался выбрать между различными решениями, такими как подробно описаны в UIViewController в UICollectionView. Похоже, что сейчас есть проект с открытым исходным кодом, который инкапсулирует этот шаблон: https://github.com/zats/Voltron. Если ваша проблема может быть лучше всего решена с помощью UICollectionView UIViewControllers, то это проще сделать, чем пытаться свернуть свою собственную.

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

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

Другие вопросы по тегам