实现带有节的TableView并用结构中的数据填充它

时间:2018-11-14 08:19:57

标签: arrays swift xcode struct tableview

我主要是iOS和Xcode开发人员的新手,所以我现在只是在这里索要一些东西...

我正在制作一个具有医疗症状的TableView的应用程序。我设法用来自数组的数据填充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 :(得分:2)

更新后的答案

我运行了OP共享的代码,发现它崩溃了。这样做的主要原因是因为SymptomsSectionsSymptomsList的内容数不相同,因此导致out of index range crash用于较小的数组,在我们的例子中是{{1} }。要解决此问题,我添加了行SymptomsList,该行基本上在访问给定索引之前检查是否存在任何对象。这解决了我们的崩溃。然后,我着手更新字典和访问方法。还随附了输出屏幕,供您理解。

请输入验证码

SymptomsList.indices.contains(index)

enter image description here

原始答案

好吧,要展示一些东西,您需要知道那件事。不知道如何获取数据。但是我可以想象您用于表视图的数据源看起来像这样:

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
}

您说对了,最简单的方法就是使用字典,这是对的。想象一下,让更新后的数据源是字典数组,就像这样:

let symptoms = ["fever", "cold", "heart ache"]

let symptoms = [["name":"fever", "checked":true], ["name":"cold", "checked":true], ["name":"heart ache", "checked":false]] 方法分配单元格时。您可以使用如下所示的内容:

cellForRow