0

У меня есть UIViewController, который я хочу использовать в качестве базового контроллера для других контроллеров представлений. Базовый контроллер имеет UICollectionView, который имеет все прототипы UICollectionViewCell и некоторые другие виды заглушек, разработанные в раскадровке.Base UIViewController с UICollectionView

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

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

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

Я программирую в Objective-C.

ответ

0

После многократного поиска я обнаружил, что его невозможно повторно использовать прототипированный UICollectionViewCell, поэтому я создал отдельный XIB для каждой ячейки представления коллекции. Это то, что я сделал:

  1. Создано XIBs для просмотра коллекции клеток.

  2. Написал базовый класс BaseViewController, который имеет UICollectionView IBOutlet, объявленный в его .h-файле. Класс BaseViewController подтверждает протоколы UICollectionViewDelegate и UICollectionViewDataSource.

    2.1 В методе BaseViewController viewDidLoad зарегистрировано все ячейки XIB для UICollectionView.

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

  3. Создайте контроллеры детского вида в раскадровке, которые имеют UICollectionView. 3.1 Подключен UICollectionView к супер UICollectionView IBOutlet, определенному в файле .h.

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

Надеюсь, это поможет кому-то. Благодарю.

+0

Вы оценили, какая из них имеет лучшую производительность? – mgyky

+0

Моя проблема не связана с производительностью, а с кодовой структурой и обработкой событий.Ответ выше спасал мне много времени, потому что я не создал какую-либо прототипную ячейку в коллекцииView в раскадровке, ни один из связанных с размером элементов в моем childViewController, у которых был CollectionView, не обрабатывался. В любой момент мне пришлось внести изменения в какой-либо из коллекцииViewCell, я бы пошел на его XIB и изменил его. Напротив этого, если я скопировал вложенные ячейки прототипа во все коллекции, мне пришлось изменить каждого из них. –

+0

ОК, спасибо ... – mgyky