tableView.reloadData()添加了不应执行的UIView

时间:2019-05-29 16:32:03

标签: ios swift uitableview

我有一个带有可选属性的模态。正如您可能已经猜到的,我只为非可选属性添加了一个UIView。在以下代码中,dueDate是可选的。第一个没有到期日,第二个没有。

let london = Task( name: "Hello from London",
                     createdDate: Date(),
                     isCompleted: false,
                     dueDate: Date())

let madrid = Task( name: "hola desde madrid",
                     createdDate: Date(),
                     isCompleted: false)

插入单元格的数据源方法。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

    if  let _ = tasks[indexPath.row].dueDate {
        cell.textLabel?.text = "Due Date"
    }

    return cell
}

当我打开应用程序时,它会按预期运行。只有第一个单元格具有Due Date。我希望如此,因为这只是第一个具有到期日期的任务。但是,当我删除第一个单元格(请参见下面的代码)并重新加载日期时,Due Date也被添加到第二个单元格中。我不明白。我希望不应该添加它,因为第二个任务没有截止日期

删除单元格的委托方法

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let remove = UITableViewRowAction(style: .normal, title: "Remove") { action, index in
        let task =  self.tasks.remove(at: indexPath.row)
        print(task.name) //
        tableView.reloadData()
    }
    remove.backgroundColor = .red

    return [remove]
}

我做错了什么?我该如何解决这个问题?


如果您需要更多信息,请询问。

2 个答案:

答案 0 :(得分:1)

这是因为出队,请替换为

cell.textLabel?.text = tasks[indexPath.row].dueDate != nil ? "London" : ""

当您删除第一个单元格时,第二个单元格会使其出队,因此您会看到第二个单元格配置了已删除单元格的属性,因此在cellForRowAt内部,您需要确保每次运行都设置代码

答案 1 :(得分:1)

查看您的cellForRow:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

    if let _ = tasks[indexPath.row].dueDate {
        cell.textLabel?.text = "London"
    }

    return cell
}

现在,当您删除一个单元格时,您可以对以前具有到期日期但现在没有截止日期的单元格调用reloadData。由于if未执行,因此您无需对单元格执行任何操作。添加一个else案例。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

    if let _ = tasks[indexPath.row].dueDate {
        cell.textLabel?.text = "London"
    }
    else {
        cell.textLabel?.text = nil
    }

    return cell
}