Обновленный ответ
Я запустил код, предоставленный OP, и заметил, что он дает сбой.Основная причина, по которой это происходит, заключается в том, что SymptomsSections
& SymptomsList
не имеет одинакового количества содержимого, что приводит к out of index range crash
для меньшего массива, который в нашем случае равен SymptomsList
.В качестве обходного пути я добавил строку SymptomsList.indices.contains(index)
, которая в основном проверяет, существует ли какой-либо объект с данным индексом, прежде чем получить к нему доступ.Это решило нашу аварию.Затем я приступил к обновлению словарей и метода доступа.Также прилагается экран вывода для вашего понимания.
Пожалуйста, введите код
let SymptomsSections = ["General", "Respiratory", "Cardiac", "Abdominal", "Neurological", "Psychiatrical"]
let SymptomsList = [[["name":"Dry mouth", "checked" : true], ["name":"Malaise", "checked" : false], ["name":"Asthenia", "checked" : true]],
[["name":"Dyspnoea", "checked" : true], ["name":"Wheezing", "checked" : false]],
[["name":"Orthopnoea", "checked" : false], ["name":"Angina", "checked" : true]],
[["name":"Coffee ground vomiting", "checked" : true], ["name":"Melaena", "checked" : true]],
[["name":"Agnosia", "checked" : false], ["name":"Apraxia", "checked" : true]]]
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return self.SymptomsSections[section]
}
func numberOfSections(in tableView: UITableView) -> Int {
return self.SymptomsSections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if SymptomsList.indices.contains(section) {
return SymptomsList[section].count
} else {
return 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SymptomsCell", for: indexPath)
if SymptomsList.indices.contains(indexPath.section) {
cell.textLabel?.text = SymptomsList[indexPath.section][indexPath.row]["name"] as? String
if SymptomsList[indexPath.section][indexPath.row]["checked"] as! Bool {
cell.accessoryType = UITableViewCellAccessoryType.checkmark
} else {
cell.accessoryType = UITableViewCellAccessoryType.none
}
} else {
cell.textLabel?.text = nil
cell.accessoryType = UITableViewCellAccessoryType.none
}
return cell
}
Оригинальный ответ
Ну, чтобы показать что-то, нужно это знать.Не уверен, как вы получаете ваши данные.Но я могу представить, что ваш источник данных для tableview выглядит примерно так:
let symptoms = ["fever", "cold", "heart ache"]
Вы правы, когда сказали, что самым простым выходом будет использование словаря.Представьте, что обновленный источник данных представляет собой массив словарей, например:
let symptoms = [["name":"fever", "checked":true], ["name":"cold", "checked":true], ["name":"heart ache", "checked":false]]
При назначении ячейки в методе cellForRow
.Вы можете использовать что-то вроде ниже:
cell.titleLabel.text = symptoms[indexPath.row]["name"]
if symptoms[indexPath.row]["checked"] {
cell.accessoryType = UITableViewCellAccessoryType.checkmark
} else {
cell.accessoryType = UITableViewCellAccessoryType.none
}