Ваша проблема может быть определена двумя способами, которые вы реализовали:
func numberOfSections(in tableView: UITableView) -> Int {
return sectionArray.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.indexOfExpendedCell == section) {
let arrayOfItems = self.sectionItemsArray[section]
return arrayOfItems.count
} else {
return 0
}
}
В первом вы объясняете, сколько разделов у вас есть, для которых вы использовали sectionArray
, а затем во втором вы используете другой массив sectionItemsArray
. Ваш сбой наиболее вероятен в случае sectionItemsArray[sectionArray.count-1]
, который завершится неудачей, если sectionItemsArray
содержит меньше элементов, чем sectionArray
.
Вероятно, вы должны иметь это согласованно и использовать только один массив. В вашем случае имеет смысл использовать массив массивов для представления разделов и строк. Но в целом может быть лучше использовать пользовательские структуры. Рассмотрим что-то вроде следующего:
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
class Section {
class Row {
let name: String
var shown: Bool = true
init(name: String) { self.name = name }
}
let name: String
var shown: Bool = true
var rows: [Row]
init(name: String, rows: [Row] = [Row]()) { self.name = name; self.rows = rows }
}
var sections: [Section]!
override func viewDidLoad() {
super.viewDidLoad()
sections = [
Section(name: "Empty"),
Section(name: "Second section", rows: [.init(name: "row 1"), .init(name: "row 2")]),
Section(name: "Third section", rows: [.init(name: "row 1"), .init(name: "row 2")])
]
}
func numberOfSections(in tableView: UITableView) -> Int {
return sections.filter { $0.shown }.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sections.filter { $0.shown }[section].name
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections.filter { $0.shown }[section].rows.filter { $0.shown }.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let name: String = sections.filter { $0.shown }[indexPath.section].rows.filter { $0.shown }[indexPath.row].name
let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
cell.textLabel?.text = name
return cell
}
}