Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用节实现TableView,并使用结构中的数据填充它_Arrays_Swift_Xcode_Struct_Tableview - Fatal编程技术网

Arrays 使用节实现TableView,并使用结构中的数据填充它

Arrays 使用节实现TableView,并使用结构中的数据填充它,arrays,swift,xcode,struct,tableview,Arrays,Swift,Xcode,Struct,Tableview,我对iOS和Xcode开发人员基本上是新手,所以我现在就来这里请求一些帮助 我正在制作一个带有医疗症状表视图的应用程序。我已设法用数组中的数据填充tableview,并根据医疗专业将其划分为多个部分。但是,我遇到了一个难题,那就是如何在表中选中多个症状,并将其保存在另一个ViewController中供以后使用 对我来说,最容易理解的方法是创建一个包含整个症状列表的字典,然后根据是否选中,为每个症状指定一个布尔值。但我不知道如何实现一个包含所有数据的结构,以及如何将其划分为多个部分 我还想知道是

我对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
}

更新的答案

我运行了OP共享的代码,发现它正在崩溃。这样做的主要原因是
症状部分
症状列表
没有相同数量的内容,从而导致
索引范围外崩溃
,在我们的例子中,较小的数组是
症状列表
。对于解决方法,我添加了一行
symplslist.indexs.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
}

更新的答案

我运行了OP共享的代码,发现它正在崩溃。这样做的主要原因是
症状部分
症状列表
没有相同数量的内容,从而导致
索引范围外崩溃
,在我们的例子中,较小的数组是
症状列表
。对于解决方法,我添加了一行
symplslist.indexs.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
}

您需要在本地保存这些数据吗?要在每次应用启动时显示吗?或者在每次打开应用程序时创建它们?我希望数据存储在本地,列表将保持不变,并显示应用程序何时启动。您知道在本地存储数据是一个大主题,我建议您在每次用户打开应用程序时首先创建应用程序,然后在您能够自己创建应用程序后,您可以跳到下一步并存储它们。@JeremyHao YangChoi如果您要使用CoreData,请看我的问题,因为我准备了一份关于必须遵循的步骤的分步指南。您需要在本地保存这些数据吗?要在每次应用启动时显示吗?或者在每次打开应用程序时创建它们?我希望数据存储在本地,列表将保持不变,并显示应用程序何时启动。您知道在本地存储数据是一个大主题,我建议您在每次用户打开应用程序时首先创建应用程序,然后在您能够自己创建应用程序后,您可以跳到下一步并存储它们。@JeremyHao YangChoi如果您要使用CoreData,请看我的问题,因为我准备了一份关于必须遵循的步骤的分步指南。我已经附上了我的代码目前的样子。我知道你是如何创建字典数组的,但我能将它实现到一个带有节的表视图中吗?@JeremyHao YangChoi是的,当然,为什么不能!如果您的代码按预期方式工作,则给出。在我看来,您只需对共享的代码库做一些小的更改。第一个变化是更新
症状列表
以保存字典。第二个更改是关于如何访问它的行
cell.textlab?.text=SymptomsList[indexPath.section][indexPath.row]
。@JeremyHao YangChoi我已经更新了答案,以解决您特定代码中面临的问题。如果这个或任何其他答案有助于您实现您想要实现的目标,请务必记住将它们标记为正确,以便将来对其他人有所帮助。我现在附上了我的代码。我知道你是如何创建字典数组的,但我能将它实现到一个带有节的表视图中吗?@JeremyHao YangChoi是的,当然,为什么不能!如果您的代码按预期方式工作,则给出。在我看来,你只需要对代码b做一些小的修改