Как иметь контроллер представления с двумя представлениями коллекции, но только один имеет представления верхнего / нижнего колонтитула? - PullRequest
0 голосов
/ 17 апреля 2020

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

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Создайте простой и короткий настраиваемый подкласс для UICollectionView, например, так:

class CustomCollectionView : UICollectionView {
    let showFooter : Bool
    let showHeader : Bool

    init(showHeader:Bool,showFooter:Bool) {
        self.showFooter = showFooter
        self.showHeader = showHeader
        //Create a custom UICollectionViewLayout and frame according to your requirement here (You can send parent ViewControllers frame as a param in the init above too)
        super.init(frame: CGRect.zero, collectionViewLayout: UICollectionViewLayout.init())
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Теперь просто инициализируйте первый CollectionView с showHeader и / или showFooter как true и другими соответственно. Вам теперь нужно будет выполнить следующий в обратном вызове делегата, который запрашивает дополнительное представление:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    guard let collectionView = collectionView as? CustomCollectionView else {
        return UICollectionReusableView.init(frame: .zero)
    }

    switch kind {
    case UICollectionView.elementKindSectionFooter:
        if collectionView.showFooter {
                //Dequeue a footer and return
        }
    case UICollectionView.elementKindSectionHeader:
        if collectionView.showHeader {
                //Dequeue a header and return
        }
    default:
        return UICollectionReusableView.init(frame: .zero)
    }
    return UICollectionReusableView.init(frame: .zero)
}
0 голосов
/ 17 апреля 2020

Первым параметром для различных источников данных и методов делегатов является представление коллекции.

Я не рекомендую использовать теги представления, как предлагал другой участник. Этот подход - fr agile.

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

@IBOulet collectionView1: UICollectionView!
@IBOulet collectionView2: UICollectionView!

Затем в вашем методе viewForSupplementaryElementOfKind :

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch collectionView {
        case collectionView1:
            //code to return a view for collection view 1
        case collectionView2:
            //code to return a view for collection view 2
        default: 
            //Can't happen, but keep the compiler happy:
            return UIView(frame: CGRect.zeroRect)
    }
}

Альтернативно, установите отдельные объекты, которые будут служить источниками данных для каждого представления коллекции. Попросите ваш контроллер представления создать источники данных и подключить их в своем методе viewDidLoad.

Если у одного представления коллекции есть заголовок, а у другого его нет, вам необходимо настроить объекты макета отдельно для каждого представления коллекции. (Вам необходимо иметь код, подобный приведенному выше, который обрабатывает два представления коллекции отдельно для ALL ваших методов представления коллекции.)

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