2015-02-26 18 views
27

Próbowałem wiele dni, aby zrealizować to: enter image description hereMultiple CollectionView w UIViewController - IOS Swift

chcę dodać w moim UIViewController dwóch różnych CollectionView. Na przykład chcę umieścić obrazy w tych kolekcjachView Każdy CollectionView używa własnych zdjęć. Czy to możliwe?

Będę bardzo szczęśliwy, jeśli ktoś może mi pomóc. :)

Odpowiedz

71

To jest możliwe, wystarczy dodać każdy UICollectionView jako widok podrzędny i ustawić delegata i źródło danych do swojego UIViewController.

Oto krótki przykład. Zakładając, że masz jedną pracę UICollectionView, powinieneś być w stanie dostosować kod do własnych zastosowań, aby dodać drugi dość łatwo:

let collectionViewA = UICollectionView() 
let collectionViewB = UICollectionView() 
let collectionViewAIdentifier = "CollectionViewACell" 
let collectionViewBIdentifier = "CollectionViewBCell" 

override func viewDidLoad() { 
    // Initialize the collection views, set the desired frames 
    collectionViewA.delegate = self 
    collectionViewB.delegate = self 

    collectionViewA.dataSource = self 
    collectionViewB.dataSource = self 

    self.view.addSubview(collectionViewA) 
    self.view.addSubview(collectionViewB) 
} 

W funkcji cellForItemAtIndexPath Delegat:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    if collectionView == self.collectionViewA { 
     let cellA = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewAIdentifier) as UICollectionViewCell 

     // Set up cell 
     return cellA 
    } 

    else { 
     let cellB = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewBIdentifier) as UICollectionViewCell 

     // ...Set up cell 

     return cellB 
    } 
} 

w funkcji numberOfItemsInSection :

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    if collectionView == self.collectionViewA { 
     return 0 // Replace with count of your data for collectionViewA 
    } 

    return 0 // Replace with count of your data for collectionViewB 
} 
+0

Otrzymuję ten błąd "UICollectionView musi zostać zainicjowany z niezerowym parametrem układu" w tym wierszu "niech collectionViewA = UICollectionView()" – dennis

+1

to nie działa dla mnie! Mam ten błąd: *** Kończenie aplikacji ze względu na nieprzechwycony wyjątek "NSInvalidArgumentException", powód: "UICollectionView musi być zainicjowany z niezerowym parametrem układu" –

5

Tak - jest to całkowicie możliwe. Można też przypisać swoje odpowiednie UICollectionViewDelegates/UICollectionViewDataSources do różnych klas lub podklasy CollectionViews, przypisując zarówno źródło delegata i danych do aktualnej viewController i przygnębiony swoje odniesienie do CollectionView w metodach delegacji tak:

@IBOutlet collectionViewA: CustomCollectionViewA! 
@IBOutlet collectionViewB: CustomCollectionViewB! 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    if let a = collectionView as? CustomCollectionViewA { 
     return a.dequeueReusableCellWithIdentifier("reuseIdentifierA", forIndexPath: indexPath) 
    } else { 
     return collectionView.dequeueReusableCellWithIdentifier("reuseIdentifierB", forIndexPath: indexPath)  
    } 
} 
+0

Co masz na myśli przez "podklasę CollectionViews"? Nie udało mi się zrobić tego, co mówisz. – Damasio

1

utworzenia gniazd dla odpowiedniego collectionviews: wylotowe:

@IBOutlet weak var collectionView: UICollectionView! 

@IBOutlet weak var SecondCollectioView: UICollectionView! 

metoda:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCell", for: indexPath) as UICollectionViewCell 

    if(collectionView == self.SecondCollectioView) { 
     cell.backgroundColor = UIColor.black 
    } else { 
     cell.backgroundColor = self.randomColor() 
    } 

    return cell; 
} 

To będzie inny sposób.

Powiązane problemy