Контроллер дочернего представления в 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
}

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


person limboy    schedule 17.03.2014    source источник


Ответы (3)


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

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

person ApperleyA    schedule 17.03.2014
comment
попался, но как обрабатывать событие кнопки (например, «Добавлено XXX»)? если использовать дочерний vc, событие кнопки может быть обработано там. но если он добавлен как свойство subView ячейки, он должен обрабатываться в UICollectionViewController, верно? так рождается толстый контроллер. - person limboy; 17.03.2014
comment
Событие касания представления дескриптора является частью обязанностей контроллера, так что все в порядке. - person limboy; 17.03.2014

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

person michaelcameron    schedule 12.12.2014

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

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

person Stephen Paul    schedule 24.09.2015