Добавление разделов в табличном представлении в мой существующий список?

Можно ли добавить разделы в мой существующий список? Или я могу как-то жестко закодировать это? Таким образом, строки 3 и 4 разделены секцией, а строки 9 и 10 разделены секцией и т. Д.
Я пытался добавить разделы, но это не очень удачно:

Список файлов:

import Foundation

class ListItem {
    var section = ""
    var listItem = ""
    var description = ""
    var extraInfo = ""
    var counter: Int = 0

    init(section: String, listItem: String, description: String, ekstraInfo: String) {
        self.section = section
        self.listItem = listItem
        self. description = description
        self.ekstraInfo = ekstraInfo
    }
}    

Контроллер просмотра:

 let staticList: [ListItem] =
    [

        ListItem(section: "Section 1", listItem: "Bananas", description: "Yellow", ekstraInfo: "Bent"),
        ListItem(section: "Section 2", listItem: "Apples", description: "Red", ekstraInfo: "Round"),
        ListItem(section: "Section 3", listItem: "Strawberries", description: "Red", ekstraInfo: ""),
        ListItem(section: "Section 4", listItem: "Carrots", description: "Orange", ekstraInfo: ""),
        ListItem(section: "Section 5", listItem: "Lime", description: "Green", ekstraInfo: "Round"),
    ]    

 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
    {
        if (tableView == MainTableView)
        {
            return staticList[section].section
        }else
        {
            return  nil
        }
    }    

РЕДАКТИРОВАТЬ:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: UITableViewCell
            cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath)

            if let customCell = cell as? MenuCell
            {
                let itemIndex = indexPath.row
                let listItem = staticList[itemIndex]

                customCell.itemLabel.text = listItem.listItem
                customCell.descriptionLabel.text = listItem.description
                customCell.exstraInfoLabel.text = listItem.exstraInfo
                customCell.counterLabel.text = "\(listItem.counter)"

                customCell.delegate = self


            }
            return cell

        }
    }

1 ответ

Решение

Я поделюсь примером с некоторыми жестко закодированными разделами. Это должно помочь вам понять, как это работает.

let numberOfRows = [2, 3, 1, 4, 5]

Здесь у нас есть массив целых чисел, который указывает количество строк. В основном 5 секций с 2, 3...5 строками в каждой секции соответственно

Добавьте следующее к вашему UITableViewDataSource:

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  return numberOfRows[section]
}

Это должно дать вам UITableView с 5 секциями, имеющими 2, 3, 1, 4, 5 рядов в каждой секции соответственно.

Поиграть с numberOfRows чтобы получить больше разделов, больше строк и т. д.

РЕДАКТИРОВАТЬ:

Причина, по которой каждый раздел загружает одни и те же ячейки, заключается в том, что staticList это одномерный массив. Следовательно, в каждом разделе одинаковые строки продолжают извлекаться как indexPath.row начинается с 0 для каждого раздела. Чтобы исправить это, сделайте staticList двумерный массив. Вот как...

let staticList: [[ListItem]] = [
    [
        ListItem(section: "Section 1", listItem: "Bananas", description: "Yellow", ekstraInfo: "Bent"),
        ListItem(section: "Section 1", listItem: "Apples", description: "Red", ekstraInfo: "Round")
    ],
    [
        ListItem(section: "Section 2", listItem: "Strawberries", description: "Red", ekstraInfo: "")
    ],
    [
        ListItem(section: "Section 3", listItem: "Carrots", description: "Orange", ekstraInfo: ""),
        ListItem(section: "Section 3", listItem: "Lime", description: "Green", ekstraInfo: "Round")
    ]
]

Сейчас staticList имеет 3 раздела с 2, 1, 2 ListItemс соответственно в каждом разделе.

Наконец, внесите небольшое изменение в функцию cellForRowAtIndexPath...

// let itemIndex = indexPath.row
// let listItem = staticList[itemIndex]

let listItem = staticList[indexPath.section][indexPath.row]

Кстати, вы можете удалить section собственность от ListItem сделать вещи чище. Покидая его, ничего не должно сломаться.

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