Обновить строки после. Удалить в TableView - PullRequest
0 голосов
/ 27 августа 2018

Добрый день!

У меня есть TableViewController с EditingStyle:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
        machine.formulas.remove(at: indexPath.row)
        machine.saveFormulas()
        tableView.deleteRows(at: [indexPath], with: .fade)
        tableView.reloadData()

    } else if editingStyle == .insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }
}

Каждая ячейка имеет метку с номером строки. Если я .reloadData (), как в коде выше, это нарушает анимацию .deleteRows (). Я пробовал разные варианты, с beginUpdates () и .reloadRows (), ничего не дало требуемого результата. Я думаю, что есть простое решение для этого, но я не могу понять это.

EDIT:

Отредактированный код, поэтому элемент сначала удаляется из массива, а затем из tableView.

Пример:

enter image description here

Если вы удалите строку # 5, как вы .reloadData (), чтобы все в порядке. Я имею в виду, что не будет 1-2-3-4-6-7-8-9-10. А как перезагрузить его, не ломая .Удалить анимацию?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

if editingStyle == .delete {
    machine.formulas.remove(at: indexPath.row)
    machine.saveFormulas()
    tableView.deleteRows(at: [indexPath], with: .fade)
    self.perform(#selector(reloadTable), with: nil, afterDelay: 2)

} 

}

@objc func reloadTable() {
      DispatchQueue.main.async { //please do all interface updates in main thread only
      self.tableView.reloadData()

}}

0 голосов
/ 27 августа 2018

просто удалите tableView.reloadData() из вашего кода, он не нужен.
Ваш переопределенный метод должен быть

override func tableView(_ tableView: UITableView, commit editingStyle: 
    UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {    
        if editingStyle == .delete {
            machine.formulas.remove(at: indexPath.row)
            machine.saveFormulas()
            tableView.deleteRows(at: [indexPath], with: .fade)            
        } else if editingStyle == .insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }
    }
0 голосов
/ 27 августа 2018

Просто удалите из источника данных и Удалить строку можно сделать, нет необходимости перезагрузить его.

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {
    machine.formulas.remove(at: indexPath.row)
    machine.saveFormulas()
    tableView.deleteRows(at: [indexPath], with: .fade)
    self.perform(#selector(reloadTable), with: nil, afterDelay: 2)

    } else if editingStyle == .insert {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }
}

@objc func reloadTable() {
    self.tableView.reloadData()
}

Попробуйте поделиться результатами.

РЕДАКТИРОВАТЬ:

Вам следует обновить метод cellForRow, чтобы установить значение на основе indexPath, а не от numbersArray

потому что изначально numberArray имеет все 10 значений. 1,2,3,4,5,6,7,8,9,10 Теперь, если вы удалите одну строку из 4-й строки, то это конкретное значение будет удалено из массива и сохранит 9 элементов, то есть 1,2,3,5,6,7,8,9,10 и будет увидеть их в клетках. Вместо этого вы должны обновить свой cellForRow, чтобы он показал indexPath.row + 1 для него.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "\(indexPath.row + 1)"
    return cell
}

Надеюсь, это прояснится.

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