2015-02-26 2 views
27

Я перепробовал много дней, чтобы понять это: enter image description hereMultiple CollectionView в UIViewController - IOS быстры

Я хочу, чтобы добавить в моем UIViewController два различных CollectionView. Например, я хочу поместить изображения в эти коллекцииView Каждый CollectionView использует свои собственные изображения. Возможно ли это?

Я буду очень рад, если кто-то может дать мне руку. :)

ответ

71

Это возможно, вам просто нужно добавить каждый UICollectionView в качестве подвью и установить делегат и dataSource на ваш UIViewController.

Вот краткий пример. Если у вас есть один UICollectionView работы, вы должны быть в состоянии адаптировать этот код для собственных целей, чтобы добавить вторую довольно легко:

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

В функции cellForItemAtIndexPath делегата:

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

В функции 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

Я получаю эту ошибку: «UICollectionView должен быть инициализирован параметром макета не-nil» в этой строке «let collectionViewA = UICollectionView()» – dennis

+1

это не сработало для меня! Я получил эту ошибку: *** Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «UICollectionView должен быть инициализирован параметром макета не-nil», –

5

Да - это вполне возможно. Вы можете назначить свои соответствующие UICollectionViewDelegates/UICollectionViewDataSources к различным классам или подкласс CollectionViews, назначая как делегат и исходные данные текущего ViewController и обратное приведение вашей ссылки на CollectionView в методах делегации, как так:

@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

Что вы подразумеваете под «подклассом CollectionViews»? Мне не удалось сделать то, что вы говорите. – Damasio

1

создать выходы для соответствующего collectionviews: точек:

@IBOutlet weak var collectionView: UICollectionView! 

@IBOutlet weak var SecondCollectioView: UICollectionView! 

метод:

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

Это будет другим способом.

Смежные вопросы