在TableView中添加不同的节及其内部项目

时间:2019-09-01 23:42:06

标签: swift uitableview

我正在使用Todo应用, 我有一个数组,其中包含项目和其中的待办事项。 例如在第一个项目中,待办事项的标题就是这样:

cell.title.text = project[0].todo[indexPath.row].title

我真的需要帮助,如何在cellForRowAt中创建此类结构,例如,我想在第0部分中说,它显示了project[0]内的待办事项,然后继续其他项目。 你能帮我吗

1 个答案:

答案 0 :(得分:1)

假设您具有以下数据结构:

struct Todo {
  let title: String
}

struct Project {
  let name: String
  let todo: [Todo]
}

然后,您必须实现TableView的数据源功能:

// Number of sections corresponds to number of projects
func numberOfSections(in tableView: UITableView) -> Int {
  return project.count
}

// Each section title corresponds to the project name
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
  return project[section].name
}

// Number of rows per section corresponds to the number to ToDos per project
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return project[section].todo.count
 }

然后您的cellForRowAt函数将从表格中取出单元格。您必须使用indexPath变量来获取数据; indexPath.section是项目的索引,而indexPath.row是项目内部的待办事项。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "id", for: indexPath)
  cell.textLabel?.text = project[indexPath.section].todo[indexPath.row].title
  return cell
}

我创建了一个小项目对此进行测试,并使用以下函数生成随机数据:

@objc private func generateData(_ sender: Any) {
  project.removeAll()
  let minimumProjects = 7
  let minimumTodos = 3
  for _ in 0...(minimumProjects + Int.random(in: 0...7)) {
    let projectName = "\(Int.random(in: 374...93842))"
    let newTodos = (minimumTodos...(minimumTodos + Int.random(in: 0...5))).map {_ in
      Todo(title: "Title: \(Int.random(in: 0...123))")
    }

    let newProject = Project(name: "Project \(projectName)", todo: newTodos)
    project.append(newProject)
  }
  DispatchQueue.main.async { [weak self] in
    self?.refreshControl.endRefreshing()
    self?.table.reloadData()
  }
}

该应用程序如下所示: enter image description here