2015-10-26 6 views
7

Ich mache eine iOS-App in Swift, und ich versuche, eine CollectionView programmgesteuert zu machen. Ich möchte meine eigene Unterklasse von UICollectionReusableView als eine Überschrift für die CollectionView verwenden, weil ich einige Schaltflächen und ein strechbares Bild in der Kopfzeile benötigen.iOS; programmgesteuert collectionView mit benutzerdefinierten Headern

SupView ist die 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) 
} 

Ich versuche, den Ergänzungs Blick in viewForSupplementaryElementOfKind, wie dies einfügen, aber ich erhalte eine Fehlermeldung beim Versuch, den Header zu erstellen:

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! 
} 

Der Fehler ist in let headerView = ... und sagt: "signal SIGABRT"

Wie soll ich die Kopfansicht initialisieren, damit ich sie in mein Flowlayout eingeben kann? vielleicht somewith mit

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

aber wenn ich versuche, die SupView-Klasse registrieren es mir Fehler gibt:

.../collectionViewPlay/ViewController.swift:32:24: Cannot invoke 'registerClass' with an argument list of type '(SupView!, forSupplementaryViewOfKind: String, withReuseIdentifier: String)'

Irgendwelche Ideen?

EDIT:

Die Umsetzung der Unterklasse angefordert wurde:

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") 
    } 

} 
+0

Zeigen Sie die Klassenimplementierung von SupView – Shoaib

Antwort

7

Also habe ich es herausgefunden, mit Inspiration von Mohamad Farhand.

Das Problem war, dass ich die Unterklasse mit der Collection, statt UICollectionReusableView.self oder der Instanz der Unterklasse .. Also das mein Problem gelöst selbst registrieren hatte:

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

Und wie initialisieren die Ansicht:

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

Sie es wie folgt tun:

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

AUCH

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

Ich denke, dass Sie diese Antwort ein wenig vertiefen müssen. Was ist 'CollectionCustomHeader.self' und' CustomeHeaderHeader' in meinem Fall? Und sollen die beiden Bezeichner übereinstimmen? – Wiingaard