2017-06-29 1 views
0

J'essaie d'ajouter un en-tête à une vue de collection liée à une requête Firebase avec FirebaseUI.UICollectionView viewForSupplementaryElementOfKind non appelé avec Firebase UI dataSource

J'ai configuré ma vue de collection avec un cadre statique pour l'en-tête de collection. (Je l'ai essayé une vue de collection avec un appel de délégué à sizeForHeaderInSection au lieu du cadre statique définie dans la présentation La méthode déléguée pour viewForSupplementaryElementOfKind n'est pas appelé peu importe..):

lazy var collectionView: UICollectionView = { 
    let layout = UICollectionViewFlowLayout() 
    layout.headerReferenceSize = CGSize(width: CGFloat(UIScreen.main.bounds.width), height: 100) 
    let view = UICollectionView(frame: .zero, collectionViewLayout: layout) 
    view.contentInset = UIEdgeInsetsMake(84, 0, 0, 0) 
    view.register(VideoPollCollectionViewCell.self, forCellWithReuseIdentifier: NSStringFromClass(VideoPollCollectionViewCell.self)) 
    view.register(PollCollectionViewHeader.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: NSStringFromClass(PollCollectionViewHeader.self)) 
    view.translatesAutoresizingMaskIntoConstraints = false 
    view.delegate = self 
    view.dataSource = self 
    view.tag = VideoPollCollectionType.polls.rawValue 
    return view 
}() 

Configurer la source de données dans viewDidLoad()

self.dataSource = self.collectionView.bind(to: self.videoPollQuery, populateCell: { (collectionView, indexPath, snap) -> UICollectionViewCell in 
     let videoPoll = VideoPoll(with: snap) 
     guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(VideoPollCollectionViewCell.self), for: indexPath) as? VideoPollCollectionViewCell else { return UICollectionViewCell() } 
     cell.setPoll(with: videoPoll) 
     return cell 
    }) 

Ajouter la source de données FirebaseUI au niveau de la propriété d'instance:

lazy var videoPollQuery: DatabaseQuery = { 
    let ref = Database.database().reference(withPath: "/polls/") 
    return ref.queryOrderedByKey() 
}() 

var dataSource: FUICollectionViewDataSource! 

Et ajouter le délégué/données l'extension source dans l'espoir que la méthode de chargement d'une vue d'en-tête de la collection est appelée

extension PollCollectionViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
     guard let view = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: NSStringFromClass(PollCollectionViewHeader.self), for: indexPath) as? PollCollectionViewHeader else { return UICollectionReusableView() } 
     return view 
    } 
} 

Cela produit une vue collection avec un en-tête vide de la taille de l'image statique définie dans la présentation de la vue collection initialiseur ou le délégué sizeForHeaderInSection méthode. Après l'ajout d'un point d'arrêt dans le viewForSupplementaryElementOfKind, j'ai été troublé de découvrir que cette fonction n'est pas appelée.

Est-ce que quelqu'un connaît la procédure correcte pour ajouter une sous-classe de UICollectionReusableView en tant qu'en-tête à une vue de collection avec une source de données de Firebase?

Répondre

0

Essayez de définir la hauteur pour une vue supplémentaire:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { 
     return CGSize(width:collectionView.frame.size.width, height:30) 
} 
+0

Ajout cela ne provoque pas la 'viewForSupplementaryElementOfKind' à appeler. – thexande