При вставке строк происходит сбой в Swift - PullRequest
0 голосов
/ 30 апреля 2018

При вставке ячеек в TableView происходит сбой. Я пробовал ссылки ниже, но не уверен, в чем проблема

Ссылка1 Ссылка2 Ссылка3 и многие

Ниже мой код

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return names.count 

}

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

Исходный код данных ниже

   private var names: [String] = (50...99).map { String($0) }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
            self.appendCells()
        }

    }

    private func appendCells() {

        names = (0...49).map { String($0) } + names
        customTableView.beginUpdates()
        let indexPat = IndexPath(row: names.count - 1, section: 0)
        customTableView.insertRows(at: [indexPat], with: .fade)
        customTableView.endUpdates()

    }

Я не могу понять, что мне здесь не хватает. Извините, если я делаю глупости. Пожалуйста, дайте мне знать, если я должен объяснить больше.

Я получаю ошибку:

причина: 'Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (100), должно быть равно количеству строк, содержащихся в этом разделе до обновления. (50),

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Ошибка ясно говорит о том, что вы добавляете indexPath с row = 99, section = 0, в то время как в действительности его самый большой indexpath содержит значения: row = 49, section = 0.

Перед вставкой tableview вызывает метод источника данных numberOfRowsInSection - этот метод должен возвращать более новый, больший счетчик массива (100), а не более ранний (50).

0 голосов
/ 30 апреля 2018

1) Ваша модель до 'appendCells' имеет 50 имен. 2) После вызова ваш режим равен 100 именам, но вы устанавливаете только одну ячейку с индексным путем = 99? Вам нужно вставить еще 50 строк вместо одной.

0 голосов
/ 30 апреля 2018

Проблема заключается в несоответствии количества значений, добавляемых в модель данных, и количества строк, добавляемых в табличное представление.

Линия:

names = (0...49).map { String($0) } + names

добавляет 50 новых значений в вашу модель данных.

Но тогда вы только скажете табличному представлению, что есть одна новая строка. Это то, что вам говорят в сообщении об ошибке.

Вам необходим цикл для создания массива из 50 путей индекса.

private func appendCells() {
    names = (0...49).map { String($0) } + names
    var paths = [IndexPath]()
    for row in 0...49 {
        let indexPath = IndexPath(row: row, section: 0)
        paths.append(indexPath)
    }
    customTableView.insertRows(at: paths, with: .fade)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...