КоллекцияПросмотр разделов

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

А как быть с остальными разделами, если n = 35?

PGDev 28.05.2019 12:05

Я не хочу, чтобы это было объявлено, просто нужно, чтобы в последнем разделе было пять или n% 10

LofiMAM 28.05.2019 12:08

Я не понял условия. Последний раздел = 5 ячеек, а остальные разделы = n%10 ячеек?

PGDev 28.05.2019 12:18

нет, если есть 35 элементов, мне нужны разделы (10,10,10,5), если 47 (10,10,10,10,7).

LofiMAM 28.05.2019 12:26

Обновлен код с необходимыми условиями.

PGDev 28.05.2019 12:30

большое спасибо мой друг, это решено.

LofiMAM 28.05.2019 12:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
308
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете просто реализовать методы UICollectionViewDataSource и настроить метод collectionView(_:numberOfItemsInSection:) на основе каждого section для количества cells.

let n = 35 //It specify the total elements count

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return n/10
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch section {
    case (n/10):
        return (n % 10)

    default:
        return 10
    }
}

В приведенном выше коде collectionView будет иметь

  • (n % 10) ячеек для last section
  • 10 ячеек для other sections

Пожалуйста, уточните ваши условия, чтобы я мог соответствующим образом обновить код.

Он создает 3 раздела, когда n = 35. Он дает [10,10,10], а не [10,10,10,5]

arun siva 28.05.2019 21:52
Ответ принят как подходящий

Если количество массивов равно 35 return count/10, если count%10 равно 0, иначе вернуть count/10+1 в методе numberOfSections

В методе numberOfItemsInSection умножьте текущий раздел на 10 и вычтите из счета. вернуть минимальное значение 10 или вычтенное значение

В методе cellForItemAt умножьте раздел на 10 и добавьте строку, чтобы получить индекс массива.

class ViewController: UIViewController, UICollectionViewDataSource {
    var arr = Array(1...35)
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return (arr.count/10) + (arr.count%10 == 0 ? 0 : 1)
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return min(10,arr.count - (10*section))
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as? Cell
        let currentStr = arr[(indexPath.section*10)+indexPath.item]
        cell?.label.text = "\(currentStr)"
        return cell!
    }
}

спасибо, да, я понял, почему это работает, я отладил код и понял, что функция numberofiteminsection вызывается по количеству секций и при каждом вызове возвращает число, которое присваивается количеству ячеек в текущем вызове.

LofiMAM 28.05.2019 12:55

Вы можете разбить массив на куски, используя это расширение

extension Array {
    func chunked(into size: Int) -> [[Element]] {
        return stride(from: 0, to: count, by: size).map {
            Array(self[$0 ..< Swift.min($0 + size, count)])
        }
    }
}

Если количество равно 35 -> [10,10,10,5]

Если количество равно 30 -> [10,10,10]

Если количество равно 29 -> [10,10,9]

Затем используйте двумерный массив в методах делегата представления коллекции.

class ViewController: UIViewController, UICollectionViewDataSource {
    let array = Array(1...35)
    lazy var chunkedArray = array.chunked(into: 10)

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return chunkedArray.count
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return chunkedArray[section].count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        print(chunkedArray[indexPath.section][indexPath.item])
        return cell
    }
}

Есть ли способ использовать var вместо числа «10»?

Creanomy 29.11.2019 10:36

Другие вопросы по теме