Как получить массив массивов внутри UICollectionView, который находится внутри UITableView, а также вернуть правильное количество элементов? - PullRequest
1 голос
/ 28 марта 2019

В настоящее время я пытаюсь выяснить, как получить UITableView с UICollectionView для правильного отображения следующего набора данных внутри UICollectionViews.

[["food 1", "food 2", "food 3"], ["car 1", "car 2", "car 3", "car 4"], ["house 1", "house 2"], ["person 1", "person 2", "person 3", "person 4"], ["kid 1", "kid 2", "kid 3", "kid 4", "kid 5"]]

У меня заголовки работают нормально, как показано ниже.

screenshot 1

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

enter image description here

Вот следующий код.

ViewController

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    let section = ["foods","cars","houses","persons","kids"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 122
        tableView.tableFooterView = UIView()
    }
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return self.section[section]
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return section.count
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? TableViewCell
        {
            data = [["food 1", "food 2", "food 3"], ["car 1", "car 2", "car 3", "car 4"], ["house 1", "house 2"], ["person 1", "person 2", "person 3", "person 4"], ["kid 1", "kid 2", "kid 3", "kid 4", "kid 5"]][indexPath.section]

            return cell
        }
        return UITableViewCell()
    }
}

CollectionViewCell

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var dataLabel: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}

Наконец, файл TableViewCell, который заполняет данные UICollectionView.

var data = [String]()

class TableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var collectionView: UICollectionView!

    let collCount = Int()
    //var imageArray = [[String]] ()
    override func awakeFromNib() {
        super.awakeFromNib()
        self.collectionView.delegate = self
        self.collectionView.dataSource = self

    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3 //should return the amount of data per array
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if let cell: CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionViewCell
        {

            cell.dataLabel.text = data[indexPath.item]

            return cell
        }
        return UICollectionViewCell()
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
        let size = CGSize(width: 256, height: 100.5)
        return size
    }
}

Как вы также можете видеть в приведенном выше коде, у меня также возникает проблема с отображением правильного количества элементов в разделе для UICollectionView.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 3 //should return the amount of data per array in the array of data
    }

Данные ...

[["food 1", "food 2", "food 3"], ["car 1", "car 2", "car 3", "car 4"], ["house 1", "house 2"], ["person 1", "person 2", "person 3", "person 4"], ["kid 1", "kid 2", "kid 3", "kid 4", "kid 5"]]

... может в конечном итоге иметь больше данных, чем то, что в данный момент дается. Например, индекс 0 в этом массиве может иметь 4 вместо текущего 3.

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

Спасибо за ваше время, я действительно ценю это.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Из-за повторного использования ячейки вы должны перезагрузить представление коллекции, когда ячейка табличного представления снята с очереди:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? TableViewCell
    {
        data = [["food 1", "food 2", "food 3"], ["car 1", "car 2", "car 3", "car 4"], ["house 1", "house 2"], ["person 1", "person 2", "person 3", "person 4"], ["kid 1", "kid 2", "kid 3", "kid 4", "kid 5"]][indexPath.section]
        cell.collectionView.reloadData()

        return cell
    }
    return UITableViewCell()
}

Кроме этого, вы должны также рассмотреть ответ vadian.

0 голосов
/ 28 марта 2019

Вы имеете дело с объектно-ориентированным языком.Воспользуйтесь этим и используйте пользовательскую структуру

struct Section {
    let title : String
    let items : [String]
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let sections = [Section(title: "foods", items: ["food 1", "food 2", "food 3"]),
        Section(title: "cars", items: ["car 1", "car 2", "car 3", "car 4"]),
        Section(title: "houses", items: ["house 1", "house 2"]),
        Section(title: "persons", items: ["person 1", "person 2", "person 3", "person 4"]),
        Section(title: "kids", items: ["kid 1", "kid 2", "kid 3", "kid 4", "kid 5"])]

...

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

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sections[section].title
}

func numberOfSections(in tableView: UITableView) -> Int {
    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return sections[section].items.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
    // force unwrap the cell. Any crash reveals a design mistake
    let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! TableViewCell
    let section = sections[indexPath.section]
    cell.dataLabel.text = section.items[indexPath.row]
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...