2017-05-16 7 views
1

Je voudrais créer UICollectionView avec en-tête. Je règle Collection Reusable View sur mainStoryBoard mais rien n'est affiché sur l'appareil. J'ai essayé de chercher mais je n'ai pas pu trouver pourquoi il n'apparaissait pas. JePourquoi la vue réutilisable de la collection n'est pas affichée?

Story Board principal

enter image description here

Sur l'appareil

enter image description here

importation UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 


    @IBOutlet weak var collectionView: UICollectionView! 

    var images = ["medal1","medal2","medal3","medal4","medal5","medal6","medal7","medal8","medal9","medal10","medal1","medal2","medal3","medal14"] 

    var texts = ["hi","yes","hoo","such","hi","yes","hoo","such","hi","yes","hoo","such","hi","yes"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 



     collectionView.delegate = self 
     collectionView.dataSource = self 

    } 

    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

     return images.count 
    } 

    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell 

     cell.myImage.image = UIImage(named: images[indexPath.row]) 

     cell.achievementLabel.text = texts[indexPath.row] 

     return cell 

    } 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 1 
    } 






} 


import UIKit 

classe pour la classe collection Voir CustomCell: UICollectionViewCell {

@IBOutlet weak var myImage: UIImageView! 

    @IBOutlet weak var achievementLabel: UILabel! 

} 

classe Collection réutilisables Voir importation UIKit

class CollectionReusableView: UICollectionReusableView { 

    @IBOutlet weak var reuseableVimage: UIImageView! 
} 


> import UIKit 

class ViewController: UIViewController, UICollectionViewDelegate { 


    @IBOutlet weak var collectionView: UICollectionView! 

    var images = ["medal1","medal2","medal3","medal4","medal5","medal6","medal7","medal8","medal9","medal10","medal1","medal2","medal3","medal14"] 

    var texts = ["hi","yes","hoo","such","hi","yes","hoo","such","hi","yes","hoo","such","hi","yes"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 



     collectionView.delegate = self 


    } 

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
     if kind == UICollectionElementKindSectionHeader { 
      let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderView", for: indexPath) 
      // do any programmatic customization, if any, here 
      return view 
     } 
     fatalError("Unexpected kind") 








} 
} 

Répondre

6

Vous devez mettre en œuvre viewForSupplementaryElementOfKind:

  1. Mettre en oeuvre collectionView(_:viewForSupplementaryElementOfKind:at:), pour UICollectionElementKindSectionHeader ou UICollectionElementKindSectionFooter, selon le cas.

    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
        if kind == UICollectionElementKindSectionHeader { 
         let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "CollectionReusableView", for: indexPath) as! CollectionReusableView 
         // do any programmatic customization, if any, here 
         return view 
        } 
        fatalError("Unexpected kind") 
    } 
    
  2. Assurez-vous que l'en-tête vue réutilisable dans IB a

    • la classe de base appropriée; et
    • le « identificateur de réutilisation » approprié
  3. Dans IB, assurez-vous « Accessoires » de la vue de la collecte ont coches à côté « Section en-tête » et « Section pied », selon le cas.

+0

Merci. J'ai mis à jour le code mais maintenant l'écran ne montre rien .. J'ai vérifié IB et les accessoires, tout va bien. – rebecca87

+0

En supposant qu'il n'y ait pas d'avertissement, je pourrais vérifier le débogueur de vue et voir s'il y a des vues dans la vue de collection et quelles sont leurs images. S'il n'y a vraiment pas de vues, alors je définirais des points d'arrêt dans les méthodes 'UICollectionViewDataSource' et je verrais qu'elles sont appelées et quelles sont les valeurs qu'elles retournent. – Rob

+0

Quand je mets collectionView.dataSource = self, il devient crush. – rebecca87

1

Essayez de mettre en œuvre. Il y a un exemple dans RayWenderlich qui pourrait vous être utile: https://www.raywenderlich.com/136161/uicollectionview-tutorial-reusable-views-selection-reordering

override func collectionView(_ collectionView: UICollectionView, 
          viewForSupplementaryElementOfKind kind: String, 
          at indexPath: IndexPath) -> UICollectionReusableView { 
switch kind { 
case UICollectionElementKindSectionHeader: 
    let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, 
                      withReuseIdentifier: "CollectionReusableView", 
                      for: indexPath) as! CollectionReusableView 
    headerView.reuseableVimage .... 
    return headerView 
default: 
    assert(false, "Unexpected element kind") 
} 
} 
+0

Merci, En fait, j'ai vu le site Web pour mettre en œuvre ce code .. – rebecca87

+0

Il semble qu'il ya quelques changements dans rapide 3:/ – rebecca87