2015-10-26 22 views
7

Realizzo un'app per iOS in modo rapido e sto cercando di creare una raccoltaView a livello di codice. Voglio usare la mia sottoclasse di UICollectionReusableView come intestazione per la collectionview, perché ho bisogno di alcuni pulsanti e un'immagine rimovibile nell'intestazione.iOS; collectionView programmabile con intestazioni personalizzate

SupView è 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) 
} 

Sto cercando di inserire la visualizzazione supplementare in viewForSupplementaryElementOfKind, come questo, ma sto ottenendo un errore quando si cerca di creare l'intestazione:

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'errore è in let headerView = ... e dice: "signal SIGABRT"

Come dovrei inizializzare l'headerview, così posso inserire il mio flusso di uscita? forse alcune con con

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

ma se provo a registrare la SupView classe mi dà errore:

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

tutte le idee?

EDIT:

è stato richiesto l'implementazione della sottoclasse:

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

Mostra l'implementazione di classe di SupView – Shoaib

risposta

7

Quindi l'ho capito, con l'ispirazione di Mohamad Farhand.

Il problema era che ho dovuto registrare la sottoclasse si Sé con l'CollectionView, invece di UICollectionReusableView.self o l'istanza della sottoclasse .. Quindi questo risolto il mio problema:

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

E come inizializzare il visualizza:

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

si può fare in questo modo:

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

ANCHE

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

Penso che sia necessario approfondire la risposta un po '. cosa sono 'CollectionCustomHeader.self' e' CustomeHeaderHeader' nel mio caso? E i due identificatori suppongono di corrispondere? – Wiingaard

Problemi correlati