CollectionView с несколькими различными ячейками, зарегистрированными в других CollectionViews - PullRequest
0 голосов
/ 24 мая 2019

У меня есть два отдельных контроллера представления.

В ViewController1 у меня есть CollectionView1 и клетка, которая отлично работает. Я настроил ячейку, используя storyboard с ReuseIdentifier "Cell1".

В ViewController2 у меня есть еще одна CollectionView2 и другая ячейка, которая работает нормально. Я настроил ячейку также используя storyboard с ReuseIdentifier "Cell2".

Обе ячейки имеют собственные классы ячеек UserCell1 и UserCell2 и отлично работают в отдельных CollectionViews.

Теперь для 2-й ячейки в CollectionView2 я хочу использовать ячейку из первого представления коллекции (ie. IndexPath(row: 1, section: 0)).

В CollectionView2, я хочу:

IndexPath(row: 0, section: 0) -> "Cell1"
IndexPath(row: 1, section: 0) -> "Cell2"

На ViewController2, в пределах cellForItemAt я попытался использовать формулу, которая указывает, какая ячейка равна dequeue на каждом index. Однако, это говорит мне, что ячейка из первого ViewController не зарегистрирована ... но та же самая ячейка работает в своем доме CollectionView, поэтому ReuseIdentifier явно работает.

В пределах cellForItemAt (numberOfRowsInSection = 2):

if indexPath == IndexPath(row: 0, section: 0) {
                guard let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell1", for: indexPath) as? UserCell1 else { return UICollectionViewCell() }
                cell1.configure(user: selectedUser)
                return cell1
            } else if indexPath == IndexPath(row: 1, section: 0) {
                guard let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell2", for: indexPath) as? UserCell2 else { return UICollectionViewCell() }
                cell2.configure(user: selectedUser)
                return cell2
            } else {
            return UICollectionViewCell()
            }

Я получаю ошибку:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier Cell1 - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

Спасибо заранее !!!! Это сводит меня с ума: (

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Чтобы использовать UICollectionViewCell в UICollectionView, необходимо сначала register cell с collectionView.

Почему Cell1 работает в CollectionView1 ине в CollectionView2?

Если вы создали cell в том же collectionView, который вы используете, часть registering cell можно пропустить.Но если вы хотите использовать его в каком-либо другом collectionView, registering the cell обязательно, чтобы это работало.По этой причине Cell1 отлично работает в CollectionView1, а не в CollectionView2.

Поскольку вы хотите использовать Cell1 и Cell2 в CollectionView2, поэтому оба cells должно быть registered с ним.

Но проблема в том, что вы создали Cell1 в самом CollectionView1 внутри storyboard.

  1. Итак, сначала вынужно создать .xib file и переместить Cell1 в него.Давайте назовем .xib file как Cell1.xib.

Предложение: Вы должны создать пользовательский UICollectionViewCell внутри .xib file, чтобы вы могли использовать его и в других местах.

Далее вам нужно зарегистрироваться Cell1 с CollectionView1 в ViewController1 и CollectionView2 в ViewController2 в viewDidLoad().

В ViewController1:

override func viewDidLoad() {
    super.viewDidLoad()
    CollectionView1.register(UINib(nibName: "Cell1", bundle: nil), forCellWithReuseIdentifier: "Cell1")
}

В ViewController2:

override func viewDidLoad() {
    super.viewDidLoad()
    CollectionView2.register(UINib(nibName: "Cell1", bundle: nil), forCellWithReuseIdentifier: "Cell1")
}

Аналогичным образом можно зарегистрировать другой тип cells с помощью collectionView также.Попробуйте реализовать это и дайте мне знать, если у вас все еще есть какие-либо проблемы.

0 голосов
/ 24 мая 2019

хорошая практика для вашего кода - определять каждую ячейку в XIB, а не в раскадровке, это поможет вам повторно использовать обе ячейки в любом представлении коллекции, зарегистрировав их из кода, вы можете увидеть пример здесь:

Как загрузить пользовательскую ячейку (xib) в ячейку UICollectionView, используя swift

, если по какой-то причине вам нужно определить ячейку в раскадровке, вам нужно объявить две ячейки-прототипа в каждом collectionView2

см. Следующий экран, у нас есть одно представление коллекции с количеством элементов = 2, и мы должны дать уникальный ReuseIdentifier для каждой ячейки

enter image description here

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