tableView.reloadData () добавляет UIView, что он не должен делать - PullRequest
0 голосов
/ 29 мая 2019

У меня есть модал с дополнительными свойствами.И, как вы уже догадались, я добавляю 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 ]

1 голос
/ 29 мая 2019

Посмотрите на свой 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
}
1 голос
/ 29 мая 2019

Это из-за удаления из очереди, поэтому замените его на

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

, когда вы удаляете первую ячейку, она удаляется из второй ячейки, поэтому вы видите вторую ячейку, настроенную с атрибутами удаленной, поэтомувнутри cellForRowAt вам нужно убедиться, что вы устанавливаете код при каждом запуске

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...