待办事项列表Swift

wf82jlnq  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(103)

我正在用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()
    }
    
    
}

我认为问题在于如何显示表的各个部分,但我没有发现如何根据需要进行更改

6tdlim6h

6tdlim6h1#

因为您为代码中的每个任务创建了一个单独的节,所以会为每个新的ToDo创建一个新的节。你说你只需要两个部分:“已完成”和“未完成”。要解决这种情况,您需要为这两个部分使用单独的数组。
以下是您需要执行的步骤:
1-)将todos数组定义为[ToDoItem]类型的单个数组。本系列将包括已完成和未完成的任务。

private var todos = [ToDoItem]()

2-)删除todoStatus数组,因为它将不再与任何分区关联。

private var todoStatus: [ToDoStatus] = [.completed, .planned]

3-)让numberOfSections函数返回2作为常量。该值可以保持恒定,因为将始终只有两个分区。

override func numberOfSections(in tableView: UITableView) -> Int {
return 2

}
4-)更新tableView(_:numberOfRowsInSection:)函数。相应地过滤todos数组以返回每个部分中的任务数。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 { 
    return todos.filter { $0.status == .completed }.count
} else { 
    return todos.filter { $0.status == .planned }.count
}

}
5-)更新cellForRowAt函数。根据段号和行号,获取对应的ToDo并配置单元格。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: Constants.cellIndentifier, for: indexPath) as? TableViewCell else {
    return UITableViewCell()
}

let todo: ToDoItem
if indexPath.section == 0 { 
    let completedTodos = todos.filter { $0.status == .completed }
    todo = completedTodos[indexPath.row]
} else { 
    let plannedTodos = todos.filter { $0.status == .planned }
    todo = plannedTodos[indexPath.row]
}

cell.configureCell(with: todo)
return cell

}
通过这些更改,您将保留todos数组中的所有ToDo项,并过滤每个部分中的相关任务。

相关问题