Swift TableView ячейки не отображаются - PullRequest
0 голосов
/ 28 марта 2019

Я получил ViewController, с двумя UITableView в нем.Они оба получают данные из одного и того же объекта, но из разных массивов внутри этого объекта.

В моем втором табличном представлении отображаются не все элементы, только 5.

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

Вот моя cellForRowAt функция:

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

        if tableView == tableViewSteps,  //This is the table that doesn't show right
            let cell = tableView.dequeueReusableCell(withIdentifier: "stepsCell", for: indexPath) as? StepsTableViewCell {

            let text = detailItem?.itemStepAr[indexPath.row] as! String

            cell.textAreaOutlet.text = "Schritt \(indexPath.row + 1) \n\(text)"

            let textAsNSString = cell.textAreaOutlet.text as NSString
            let lineBreakRange = textAsNSString.range(of: "\n")
            let newAttributedText = NSMutableAttributedString(attributedString: cell.textAreaOutlet.attributedText)
            let boldRange: NSRange
            if lineBreakRange.location < textAsNSString.length {
                boldRange = NSRange(location: 0, length: lineBreakRange.location)
            } else {
                boldRange = NSRange(location: 0, length: textAsNSString.length)
            }

            newAttributedText.addAttribute(NSAttributedString.Key.font, value: UIFont.preferredFont(forTextStyle: UIFont.TextStyle.headline), range: boldRange)

            cell.textAreaOutlet.attributedText = newAttributedText

            let fixedWidth = cell.textAreaOutlet.frame.size.width
            let newSize = cell.textAreaOutlet.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
            cell.textAreaOutlet.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
            cell.textAreaOutlet.isScrollEnabled = false
            tableStepsHeight = tableStepsHeight + Int(newSize.height)

            cell.textAreaOutlet.textColor = UIColor.lightGray

            tableViewSteps.frame = CGRect(x:0, y: currentViewHeight + 20, width: 375, height: tableStepsHeight)
            changeScrollHeight()
            return cell

        }

        else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ingredsCell")! //1.
        let text = detailItem?.itemIngredAr[indexPath.row]

        cell.textLabel?.text = text as? String

        cell.textLabel?.font = UIFont(name: "Futura-Medium", size: 17)

        cell.textLabel?.textColor = UIColor.lightGray

        return cell
        }
    }

, как прокомментировано, первое представление таблицы - это то, которое не работает должным образом.Он запускается только 5 раз, когда я смотрю его с помощью отладчика, но в массиве больше элементов.

Редактировать:

Вот моя numberOfRowsInSection функция

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (tableView == tableViewSteps) {
            return detailItem?.itemStepAr.count ?? 0
        }
        else {
        return detailItem?.itemIngredAr.count ?? 0
        }
    }

Редактировать 2:

Когда я включаю прокрутку в моем TableView, а затем пытаюсь выполнить прокрутку, появляются все элементы.Но прокрутка должна быть отключена, потому что она автоматически изменяет размеры (что работает)

Окончательное редактирование:

Я добавил еще немного высоты к tableView и включил прокрутку (но отключил отскок,так что вы ничего не видите в свитке)

Теперь он загружается правильно и все работает нормально

1 Ответ

0 голосов
/ 28 марта 2019

A UITableView работает с утилизацией UITableViewCell с. Это означает, что просмотр таблицы будет сначала загружать только видимые ячейки, и только при прокрутке он будет загружать больше ячеек (перерабатывая старые ячейки).

Проблема, которую я вижу, заключается в том, что вы можете попытаться получить высоту табличного представления, чтобы обновить ограничение высоты (чтобы табличное представление отображалось полностью). Но это может быть неправильным вычислением (как сказано выше, он только создает экземпляры первых x ячеек, поэтому он не может знать высоту оставшихся ячеек). Кроме того, этот расчет никогда не должен выполняться с cellForRowAt, так как этот метод никогда не должен делать что-либо вне ячейки (если вы не хотите знать, когда ячейка стала видимой).

Вы можете исправить это, задав для всех ваших клеток заранее заданную высоту, а затем умножив ее на количество ячеек.

Если у вас есть ячейки с самооценкой, это невозможно сделать (читай: это можно сделать, но это слишком громоздко и неэффективно, чтобы быть практичным).

Вы можете попытаться рассмотреть все другие представления, которые должны прокручиваться выше и ниже представления таблицы, в ячейки представления таблицы. Тогда вы можете просто использовать обычное представление таблицы, без каких-либо особых ограничений по высоте и вычислений.

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