Добавление разделов в табличном представлении в мой существующий список?
Можно ли добавить разделы в мой существующий список? Или я могу как-то жестко закодировать это? Таким образом, строки 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
сделать вещи чище. Покидая его, ничего не должно сломаться.