Создание пользовательского класса UICollectionView с необязательным делегатом заголовка - PullRequest
0 голосов
/ 02 мая 2020

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

protocol FeedDelegate {
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
}

class FeedCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
     //Custom UICollectionView
}

Использование по назначению

class VC1 {
   //Use FeedCollectionView without header
}

class VC2: FeedDelegate {

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        //Access header protocol
    }
}

1 Ответ

0 голосов
/ 02 мая 2020

Проблема в том, что если вы звоните viewForSupplementaryElementOfKind, вы должны вернуть представление. И во избежание проблем просмотр должен быть исключен из коллекции viewview (его нужно сначала зарегистрировать).

func collectionView(_ collectionView: UICollectionView,
                        viewForSupplementaryElementOfKind kind: String,
                        at indexPath: IndexPath) -> UICollectionReusableView {
        return collectionView
            .dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader,
                                                               withReuseIdentifier: "",
                                                               for: indexPath)
}

Итак, вместо этого вы можете добавить Bool к вашему коллекционному представлению. Нечто подобное showHeader, которое вы можете установить из своего V C и изменить размер заголовка в соответствии с ним (настройка (0, 0), когда showHeader == false

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

class FeedCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
     // Does not configure any header
}

class HeaderFeedCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
     // Implements that method

}

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