J'ai un UIcollectionView qui a un en-tête et un pied de page et parfois un bug bizarre montre simplement l'écran vide. C'est étrange parce que même sur le Débogueur de Vue il apparaît comme vide mais l'En-tête est une image statique qui est sur l'application et que quelque chose ne reçoit pas de l'API et qui n'apparaît pas non plus.swift UICollectionView montrant l'en-tête de bug parfois vide parfois
Aussi la console ne donne aucune méthode d'erreurs. J'essaie d'aller à une autre vue et de forcer un reloadData() mais ne montre toujours rien. De toute façon je peux mieux déboguer cela ou m'assurer que ça n'arrive pas?
Voici comment le débogueur de vue ressemble à:
Vous pouvez voir l'en-tête et pied de page vide vues réutilisables:
Edit:
C'est ainsi que les vues supplémentaires sont créées ted utilisant RxDataSources
dataSource.supplementaryViewFactory = { (dataSource, collectionView, kind, indexPath) in
switch kind {
case UICollectionElementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: CellReuseId.contentHeaderCollectionView, for: indexPath) as! ContentHeaderView
headerView.imageView.image = ImageAssets.contentBanner
let tapGestureRecognizer = UITapGestureRecognizer(target:self, action: #selector(self.showListOfEvents(_:)))
headerView.addGestureRecognizer(tapGestureRecognizer)
return headerView
case UICollectionElementKindSectionFooter:
let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: CellReuseId.contentFooterCollectionView, for: indexPath) as! ContentFooterView
footerView.setUpObjects()
//setUp Appropiate label or animation
let showFooter: Bool = !(self.centerActivityIndicator?.isAnimating ?? false)
footerView.setUpAppropiateDependingOnResults(isThereMoreResults: self.isThereMoreResults, showFooter: showFooter)
return footerView
default: break
}
//return default
return UICollectionReusableView()
}
Et voici le code qui obtient les modèles pour l'API et les lie au CollectionView
let results = Observable.of(paginationObserver, offlineObserver).merge()
//calls method that calls DB with the appropiate data
.flatMapLatest { [unowned self] parametersChanged -> Driver<LecturesStateResults> in
//since this is being called again, we make sure to clean out "old cache data" on view model
self.videoObject.lecturesResults.value.removeAll(keepingCapacity: true)
return self.setupLectures().asDriver(onErrorJustReturn: LecturesStateResults.empty)
}
results
//Bind the result observable to the UIcollectionView
//UiCollection view only wants an array not an Observable
.map {
if !$0.results.isEmpty { self.centerActivityIndicator?.stopAnimating()}
return [SectionModel(model: "", items: $0.results)]
}
.bind(to: lectureViewSquare.rx.items(dataSource: dataSource))
.addDisposableTo(disposeBag)
lectureViewSquare.rx.setDelegate(self)
.addDisposableTo(disposeBag)
Pourriez-vous nous montrer un peu de code? – kikettas
C'est un peu compliqué car j'ai une UICollectionView et une UICollectionCell définies et j'utilise RxSwift pour lier les données à la table. J'utilise aussi UICollectionViewDelegateFlowLayout – baldemora
Utilisez-vous Storyboards ou Xib? Je suppose que vous remplacez les méthodes CollectionView dataSource, n'est-ce pas? – kikettas