我正在使用Todo应用, 我有一个数组,其中包含项目和其中的待办事项。 例如在第一个项目中,待办事项的标题就是这样:
cell.title.text = project[0].todo[indexPath.row].title
我真的需要帮助,如何在cellForRowAt
中创建此类结构,例如,我想在第0部分中说,它显示了project[0]
内的待办事项,然后继续其他项目。
你能帮我吗
答案 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()
}
}