Реализовать TableView с разделами и заполнить его данными из структуры - PullRequest
0 голосов
/ 14 ноября 2018

Я в основном новичок в разработке для iOS и Xcode, поэтому сейчас я просто прошу дать некоторую ручную работу ...

Я делаю приложение с TableView медицинских симптомов.Мне удалось заполнить табличное представление данными из массива и разделить их на разделы в зависимости от медицинской специальности.Однако я наткнулся на кирпичную стену, чтобы иметь возможность пометить несколько симптомов в таблице и сохранить их для последующего использования в другом ViewController.

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

Мне также интересно, будет ли лучше просто хранить все данные ввнешний файл и разрешить приложению доступ к данным.

Я могу добавить код, который я написал до сих пор, если это необходимо.

Помощь будет принята с благодарностью!

Ниже приведена моя текущая реализация источника данных

    let SymptomsSections = ["General", "Respiratory", "Cardiac", "Abdominal", "Neurological", "Psychiatrical"]

    let SymptomsList =
        [
                ["Dry mouth", "Malaise", "Asthenia"],
                ["Dyspnoea", "Wheezing"],
                ["Orthopnoea", "Angina"],
                ["Coffee ground vomiting", "Melaena"],
                ["Agnosia", "Apraxia"]
        ]

и код для его записи в tableView

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

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

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

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

    cell.textLabel?.text = SymptomsList[indexPath.section][indexPath.row]
    return cell
}

1 Ответ

0 голосов
/ 14 ноября 2018

Обновленный ответ

Я запустил код, предоставленный 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
}

enter image description here

Оригинальный ответ

Ну, чтобы показать что-то, нужно это знать.Не уверен, как вы получаете ваши данные.Но я могу представить, что ваш источник данных для 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...