我正在用UIKIT在Swift语言中做一个应用程序,应用程序如下ToDo List,其中我需要输出任务如下1应该只有两个部分完成了标记和未完成的按钮,现在我已经达到了在新部分中创建每个新ToDo的地步。怎么办?这是我的代码,我得到的数据源是一个数组,里面有一个数组
import UIKit
class TableViewController: UITableViewController {
private var arrExecuteToDo = [String]()
private var todos = [[ToDoItem]]()
private var selectedIndex: Int? // global var for the operation of the row index in the extension
private var todoStatus: [ToDoStatus] = [.completed, .planed]
enum Constants {
static let addTaskIndentifier: String = "addTaskVc"
static let cellIndentifier: String = "ToDoCell"
static let mainStoryboard: String = "Main"
static let secondVC: String = "secondVC"
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == Constants.addTaskIndentifier {
let addTaskVC = segue.destination as? AddTaskViewController // create a link to the second view controller
addTaskVC?.type = .create
addTaskVC?.delegate = self // subscribe it to the delegate of the second controller
}
}
// MARK: - Table view Data Source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
todos[section].count
}
override func numberOfSections(in tableView: UITableView) -> Int {
todos.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.cellIndentifier,
for: indexPath) as? TableViewCell else { return UITableViewCell() } // cast on your cell
_ = todos[indexPath.row] // pick up the current body by cell index
let todo = todos[indexPath.section]
cell.configureCell(with: todo[indexPath.row]) // config a cell from a cell
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let secondeVC = UIStoryboard(name: Constants.mainStoryboard, bundle: .main).instantiateViewController(
withIdentifier: Constants.secondVC) as? AddTaskViewController else {
fatalError("Unable to Instantiate Quotes View Controller")
}
let todoSection = todos[indexPath.section]
_ = secondeVC.view
secondeVC.configure(with: todoSection[indexPath.row])
secondeVC.type = .edit
secondeVC.delegate = self
navigationController?.pushViewController(secondeVC, animated: true)
selectedIndex = indexPath.row
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { // swipe deleted todo
if (editingStyle == UITableViewCell.EditingStyle.delete) {
todos.remove(at: indexPath.section)
tableView.reloadData()
}
}
}
// MARK: - Extensions
extension TableViewController: AddTaskVCDelegate {
// here we get data from the second view
func didCreateToDo(todo: ToDoItem) {
todos.append([todo]) // add a new element to the array
tableView.reloadData() // reload the table
}
func didUpdateToDo(todo: ToDoItem) {
guard let index = selectedIndex else { return }
todos[index] = [todo]
tableView.reloadData()
}
func didDeleteToDo() { // add protocol method for delete todo
guard let index = selectedIndex else { return }
todos.remove(at: index)
tableView.reloadData()
}
}
我认为问题在于如何显示表的各个部分,但我没有发现如何根据需要进行更改
1条答案
按热度按时间6tdlim6h1#
因为您为代码中的每个任务创建了一个单独的节,所以会为每个新的ToDo创建一个新的节。你说你只需要两个部分:“已完成”和“未完成”。要解决这种情况,您需要为这两个部分使用单独的数组。
以下是您需要执行的步骤:
1-)将todos数组定义为[ToDoItem]类型的单个数组。本系列将包括已完成和未完成的任务。
2-)删除todoStatus数组,因为它将不再与任何分区关联。
3-)让numberOfSections函数返回2作为常量。该值可以保持恒定,因为将始终只有两个分区。
}
4-)更新tableView(_:numberOfRowsInSection:)函数。相应地过滤todos数组以返回每个部分中的任务数。
}
5-)更新cellForRowAt函数。根据段号和行号,获取对应的ToDo并配置单元格。
}
通过这些更改,您将保留todos数组中的所有ToDo项,并过滤每个部分中的相关任务。