Как использовать один массив в нескольких разделах collectionView? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть один массив, который содержит информацию об игре.Мой Json имеет 12 пунктов на странице.Я сделал 4 раздела, который имеет 3 строки.Он повторяет первые 3 элемента массива в каждом разделе.

Снимок экрана из приложения

Я хочу использовать это;

Всего элементов = 12

  1. Раздел = 12 3
  2. Раздел = 4 5 6
  3. Раздел = 7 8 9
  4. Раздел = 10 11 12

Как я могу это сделать?Заранее спасибо:)

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return id.count / 3
}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

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

        cell.gameName.text = name[indexPath.row]
        cell.gameImage.sd_setImage(with: URL(string:resimUrl[indexPath.row]))

    return cell
}

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Рассмотрим этот случай ниже и реализуем его,

var array = [1,2,3,4,5,6,7,8,9,10,11,12]

//Statcially you can slice them like this

    var arr2 = array[0...2] {
        didSet {
            //reload your collection view
        }
    }
    var arr3 = array[3...5]
    var arr4 = array[6...8]
    var arr5 = array[9...array.count - 1]

Выше вы вручную нарезали dataSource для каждого UICollectionView, но проблема в том, что это действительно рискованно и в конечном итоге может привести к Index Out of Rangeсбой, поэтому мы динамически нарезаем массив через цикл, используя индекс каждого элемента в диапазоне +3 индекса, чтобы добавить к новому источнику данных UICollectionView.

    // loop thru the main array and slice it based on indexes
for(index, number) in array.enumerated() {
    if 0...2 ~=  index { // if in range
        arr2.append(number)
    } else
    if index <= 5 {
        arr3.append(number)
    } else
    if index <= 8 {
        arr4.append(number)
    } else
    if index <= 11 {
        arr5.append(number)
    }
}

Наконец : в вашем numberOfItemsInSection отметьте UICollectionView и установите возвращаемый источник данных, например,

if collectionView = myMainCollectionView { 
return arr3.count 
}

И то же самое дляcellForItemAt

Heads Up : убедитесь, что ваши массивы источников данных изначально пусты,

let arr2: [Int] = [] { 
 didSet{
  //reload your collectionView 
 }
}
0 голосов
/ 03 февраля 2019

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

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return id.count / 3
}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "lastAddedCell", for: indexPath) as! lastAddedCell
    let index = indexPath.row + (indexPath.section * 3) // The index is then based on the section which is being presented
    cell.gameName.text = name[index]
    cell.gameImage.sd_setImage(with: URL(string:resimUrl[indexPath.row]))

    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...