Съемная ячейка многократного использования sh в tableView - PullRequest
0 голосов
/ 13 февраля 2020

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

Странно то, что я запускаю, как только функция работает без проблем, если я делаю это во второй раз, то это происходит sh с этой ошибкой.

* Завершение приложения из-за необработанного исключения 'NSRangeException', причина: '* - [__ NSSingleObjectArrayI objectAtIndex:]: индекс 1 за пределами [0 .. 0 ] '

Вот мой код:

override func viewWillAppear(_ animated: Bool) {
    if prodottoDaAggiungere != nil {
        prodotti.append(prodottoDaAggiungere!)
        let indexPath = IndexPath(row: prodotti.count-1, section: 1)
        tableView.insertRows(at: [indexPath], with: .fade) // ?
        prodottoDaAggiungere = nil
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if indexPath.row < prodotti.count && indexPath.section == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProdottoTableViewCell", for: indexPath) as! ProdottoTableViewCell // Crash :|
        let indexRow = indexPath.row // Fix
        cell.title.text = "\(prodotti[indexRow].prodotto.nome!) - \(prodotti[indexRow].prodotto.marca!)"
        cell.subtitle.text = "\(prodotti[indexRow].prodotto.formati[prodotti[indexRow].formato].dimensione) \(prodotti[indexRow].prodotto.unitàMisura!) - \(prodotti[indexRow].prodotto.formati[prodotti[indexRow].formato].prezzo) €"
        cell.number.text = Int(cell.stepper.value).description // 1
        cell.stepper.addTarget(self, action: #selector(stepperChanged), for: .valueChanged)
        return cell
    }

    return super.tableView(tableView, cellForRowAt: indexPath)
}

Используя точку останова, я создал приложение cra sh на dequeueReusableCell, но я не могу понять почему, кто-то может сказать мне, почему этот код sh?

Вот мой столикПросмотреть номерOfRowsInSection fun c:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if section == 0 {
        return 1
    } else if section == 1 {
        return 1+prodotti.count
    } else {
        return 0
    }
}

Storyboard

Cell

Result

Действительно спасибо AP

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Массивы имеют границы от индекса 0 до N - 1, составляющего N = yourArray.count. Таким образом, ваша верхняя граница должна достигнуть yourArray.count - 1. В вашем случае:

let indexPath = IndexPath(row: prodotti.count - 1, section: 0)

Обратите внимание, что разделы также начинаются с 0.

Другими словами: количество элементов отличается от их фактических индексов , которые являются их текущей позицией минус 1.

1 голос
/ 13 февраля 2020

Проблема связана с этой частью:

let indexPath = IndexPath(row: prodotti.count, section: 1)

Если prodotti.count равно 2, то вы пытаетесь прокрутить строку с индексом 2, когда счетчик равен 2. Вам нужно переключить его так что вы собираетесь на count - 1, например:

let indexPath = IndexPath(row: prodotti.count - 1, section: 1)

Кроме того, вам нужно обновить массив prodotti с добавлением нового элемента, который вы добавили. Поскольку количество строк в этом разделе равно prodotti + 2, первые два раза оно работает, но, поскольку вы на самом деле не увеличили размер prodotti, табличное представление не знает, что теперь должно быть больше строки.

0 голосов
/ 16 февраля 2020

У меня есть решение для вас:

{ ссылка }

На самом деле спасибо: Шан Е.

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