web-dev-qa-db-fra.com

iOS; collectionAfficher par programme avec en-têtes personnalisés

Je crée une application iOS dans Swift et j'essaie de créer une collectionView par programme ... Je veux utiliser ma propre sous-classe de UICollectionReusableView en tant qu'en-tête pour la vue de collection, car j'ai besoin de boutons et d'une image pouvant être affichée à l'écran. l'en-tête.

SupView est le UICollectionReusableView.

override func viewDidLoad() {
    super.viewDidLoad()


    let layout = UICollectionViewFlowLayout()
    layout.headerReferenceSize = CGSizeMake(self.view.frame.width, 200)

    someView = SupView(frame: CGRectMake(0, 0, view.frame.width, 200))

    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self

    collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell")  // UICollectionReusableView
    self.view.addSubview(collectionView)
}

J'essaie d'insérer la vue supplémentaire dans viewForSupplementaryElementOfKind, comme ceci, mais j'obtiens une erreur en essayant de créer l'en-tête:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
    var reusableView : UICollectionReusableView? = nil

    // Create header
    if (kind == UICollectionElementKindSectionHeader) {
        // Create Header
        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell", forIndexPath: indexPath) as! SupView
        headerView.frame = CGRectMake(0, 0, view.frame.width, 200)

        reusableView = headerView
    }
    return reusableView!
}

L'erreur est dans let headerView = ... et dit: "signal SIGABRT"

Comment dois-je initialiser la présentation en tête, afin que je puisse entrer dans mon flux de données? peut-être un peu avec 

collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell")

mais si j'essaie d'enregistrer la classe SupView, cela me donne une erreur: 

.../collectionViewPlay/ViewController.Swift: 32: 24: Impossible d'appeler 'registerClass' avec une liste d'arguments de type '(SupView !, forSupplementaryViewOfKind: String, withReuseIdentifier: String)'

Des idées?

MODIFIER:

La mise en œuvre de la sous-classe a été demandée:

    import UIKit

    class SupView: UICollectionReusableView {

    //////////////////////////////////////////////////////////////////////////////
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.myCustomInit()
    }


    //////////////////////////////////////////////////////////////////////////////
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.myCustomInit()
    }

    func myCustomInit() {
        print("hello there from SupView")
    }

}
13
Wiingaard

J'ai donc compris, inspiré par Mohamad Farhand.

Le problème était que je devais inscrire la sous-classe elle-même auprès de collectionView, au lieu de UICollectionReusableView.self, j'ai utilisé l'instance de la sous-classe someView .. Cela a donc résolu mon problème:

collectionView.registerClass(SupView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader , withReuseIdentifier: "someRandonIdentifierString")

Et comment initialiser la vue:

someView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "someRandonIdentifierString", forIndexPath: indexPath) as! SupView
16
Wiingaard

Notez que Swift 4.1 renomme le ofKind: constant en UICollectionView.elementKindSectionHeader.

3
JonJ

vous pouvez le faire comme ceci:

 // Setup Header
 self.collectionView?.registerClass(CollectionCustomHeader.self, forSupplementaryViewOfKind: CustomeHeaderHeader, withReuseIdentifier: "customHeader")

ÉGALEMENT

 override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    if kind == CustomeHeaderHeader {
        let view = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "parallaxHeader", forIndexPath: indexPath)
        return view
    }
1
Mo Farhand

Voici un Swift 3 & 4 answer que j'ai utilisé dans un projet

self.collectionView.register(LibraryHeaderNib.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader , withReuseIdentifier: "LibraryHeaderNib")

et à l'intérieur viewForSupplementaryElementOfKind

let reusableView = self.collectionView!.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "LibraryHeaderNib", for: indexPath) as! LibraryHeaderNib

return reusableView
0
Niall Kiddle