Когда я удаляю и затем добавляю строку в табличное представление, она добавляет удаленную строку - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь позволить пользователю редактировать таблицу, которая добавляет и удаляет строки.

Это работает.Но если я удаляю строку и затем добавляю, вставленная строка содержит информацию об удаленной строке.Является ли буквально удаленная строка.

Что я делаю неправильно?

@IBAction func addArticle(_ sender: UIButton) {
    numItems += 1
    let indexPath = IndexPath(row: numItems - 1, section: 0)
    myTableView.beginUpdates()
    myTableView.insertRows(at: [indexPath], with: .automatic)
    myTableView.endUpdates()
    view.endEditing(true)
}

@objc func removeArticle(sender: UIButton) {
    numItems -= 1
    let indexPath = IndexPath(row: sender.tag, section: 0)
    myTableView.beginUpdates()
    myTableView.deleteRows(at: [indexPath], with: .automatic)
    myTableView.endUpdates()
}

Источник данных и делегат для просмотра таблицы следующим образом:

extension MyViewController: UITableViewDataSource, UITableViewDelegate{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return numItems
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        numItems -= 1
        self.myTableView.beginUpdates()
        self.myTableView.deleteRows(at: [indexPath], with: .automatic)
        self.myTableView.endUpdates()
    }
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if firstUse{
        firstUse = false
    }
}

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

    if firstUse{
        //setting cell
        //...
        cell.name.isEnabled = false
        cell.name.textColor = UIColor.gray
        cell.unit.text = //something
    }

    return initCell(cell: cell, indexPath: indexPath)
}

func initCell(cell: MyTableViewCell, indexPath: IndexPath) -> MyTableViewCell {
    cell.name.inputAccessoryView = addDoneToolbarKeyboard()
    cell.amount.inputAccessoryView = addDoneToolbarKeyboard()

    cell.name.filterStrings(getFilteredBy())
    cell.minusButton.tag = indexPath.row
    cell.minusButton.addTarget(self, action: #selector(self.removeArticle), for: .touchUpInside)
    cell.name.itemSelectionHandler = { filteredResults, itemPosition in
        //irrelevant code
        }
    }

    return cell
}

}

Заранее спасибо.

1 Ответ

0 голосов
/ 19 ноября 2018

Я не вижу использования indexPath в вашем initCell методе (кроме установки cell.minusButton.tag). Как правило, вы используете indexPath в качестве индекса для массива данных или чего-то похожего в этом направлении. Я мог бы точно сказать, смогу ли я увидеть, где ваша таблица получает данные, но, судя по этому и тому, как вы называете names = Array() и amounts = Array(), я предполагаю, что вы не обновляете свою модель данных, когда вы добавить что-то на стол. Таблица удаляет ячейку и получает удаленные данные. Поскольку модель данных, питающая ячейку, не обновляется, она создает эту же ячейку и отображает ее

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