viewForSupplementaryElementOfKind не устанавливает текст метки до тех пор, пока представление коллекции не будет прокручено - PullRequest
4 голосов
/ 20 апреля 2020

Я использую viewForSupplementaryElementOfKind для создания заголовка в моем представлении коллекции.

Заголовок (SectionHeader) - это аксессуар заголовка раздела в раскадровке, который просто содержит 1 выход.

class SectionHeader: UICollectionReusableView {
    @IBOutlet weak var sectionHeaderlabel: UILabel!
}

Вот моя реализация viewForSupplementaryElementOfKind

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

    print("SECTION TITLE (brand of bindings) --------> \(sectionTitle)")

    if let sectionHeader = allCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "bindingsID", for: indexPath) as? SectionHeader{
        sectionHeader.sectionHeaderlabel.text = "Select \(sectionTitle)"
        return sectionHeader
    }
    return UICollectionReusableView()

}

sectionTitle устанавливается через segue.

Проблема заключается в том, что этот View Controller загружается заголовок гласит «Выбрать»

Когда я прокручиваю заголовок за пределы экрана, а затем снова на экране, заголовок отображается правильно: «Выбор привязок Бертона»

Я протестировал sectionTitle в viewWillAppear и напечатал правильные данные.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("viewWillAppear ----- \(sectionTitle)")
}

(напечатано viewWillAppear ----- Burton Bindings)

Полагаю, моя проблема связана с жизненным циклом viewForSupplementaryElementOfKind а когда это называется?

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

Ответы [ 2 ]

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

Проблема здесь заключалась в том, что viewForSupplementaryElementOfKind вызывался перед viewWillAppear. В рамках viewWillAppear я перезагружал коллекционное представление. Все, что мне нужно было сделать, чтобы правильно отобразить заголовок раздела, - это обновить его в viewWillAppear после .reloadItems

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // ---
    allCollectionView.reloadItems(at: allCollectionView.indexPathsForVisibleItems)

    // Access the SectionHeader and update the title now.
    let headerView = allCollectionView.visibleSupplementaryViews(ofKind: UICollectionView.elementKindSectionHeader)[0] as! SectionHeader
    headerView.sectionHeaderLabel.text = "Select \(sectionTitle)"

}

В viewForSupplementaryElementOfKind.

* 1007 не задан текст. здесь нужно было обновить текст headerView sectionHeaderLabel в viewWillAppear после , перезагрузка collectionView.
0 голосов
/ 24 апреля 2020

Я вижу два возможных альтернативных варианта (если я правильно понял, что ваш вариант использования предпочтителен в первую очередь).

1) сделать доступным sectionTitle при создании экземпляра контроллера представления (ie. До загрузки представления)

2) перестройте макет раздела прямо перед появлением (когда ваш заголовок доступен) - этот очень тяжелый

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("viewWillAppear ----- \(sectionTitle)")

    // as it is available here force rebuild sections
   self.collectionView.collectionViewLayout.invalidateLayout() 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...