0

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 à:

this is how the view debugger looks like

Vous pouvez voir l'en-tête et pied de page vide vues réutilisables:

you can see the header and footer empty

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) 
+0

Pourriez-vous nous montrer un peu de code? – kikettas

+0

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

+0

Utilisez-vous Storyboards ou Xib? Je suppose que vous remplacez les méthodes CollectionView dataSource, n'est-ce pas? – kikettas

Répondre

1

J'ai eu le même problème avec le même rendu ui, mais sans utiliser RxSwift .

Le code qui fixe la question était

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.collectionView reloadData]; 
});