Не удается получить ячейку в таблице по высотеForRowAt

Я пытаюсь установить высоту ячейки для динамического содержимого. В ячейке я использую два UILabel, но я не могу получить доступ к ячейке из tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath). Как показывает табличное представление, в img есть ячейки, но print("Cell geted") ничего не выводит, когда я запускаю приложение в симуляторе. Я только начинаю разрабатывать IOS, поэтому в моем приложении может быть какая-то неправильная конфигурация. Я хочу знать, какие причины могут привести к этому

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let cell = self.tableView.cellForRow(at: indexPath) as? ArticleTableViewCell
    if(cell != nil) {
        print("Cell geted")
    }
    return 120
}

введите здесь описание изображения

Я использую файл xib для определения ячейки

Класс ячеек Comtum, как показано ниже

import UIKit

class ArticleTableViewCell: UITableViewCell {

    @IBOutlet weak var time: UILabel!
    @IBOutlet weak var digest: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        time.layer.borderWidth = 1
        //time.layer.masksToBounds = true
        time.layer.cornerRadius = 10
        time.backgroundColor = UIColor.cyan
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

и файл раскадровки xib, как показано ниже

введите здесь описание изображения


person LF00    schedule 16.01.2018    source источник


Ответы (3)


В heightForRow вы должны вернуть UITableViewAutomaticDimension. Если вы это сделаете, то tableView автоматически использует авторазметку, когда получает ячейку из cellForRowAt.

Короче говоря:

  1. В настройках viewDidLoad:

    tableView.estimatedRowHeight = 100
    tableView.rowHeight = UITableViewAutomaticDimension
    
  2. Настройте авторазметку в ячейке, чтобы ячейка могла определять свой размер по своему содержимому.

    Чтобы настроить дизайн ячейки в ячейке xib с помощью автомакета, прочитайте эта статья. В вашем случае вы можете сделать следующее:

    Сначала нажмите на ярлык, чтобы выбрать его. Затем нажмите значок «Добавить новые ограничения» в правом нижнем углу, см. следующее изображение:

    введите здесь описание изображения

    В небольшом всплывающем окне отображаются установленные константы, которые определяют, насколько далеко от верхнего, левого, нижнего и правого углов ячейки должна быть ограничена метка. Убедитесь, что красные линии, указывающие на активируемые ограничения, находятся в полной строке (они должны измениться с пунктирных на полные, как только вы заполните константы). Попробуйте сначала установить 8 для каждого направления, позже вы сможете поиграть с ним.

введите здесь описание изображения

However, make sure that you read [this article][1] and also [this article on autolayout][4].
  1. Просто верните ячейку в cellForRowAt. TableView будет использовать автомакет ячейки для определения ее высоты.

Подробнее см. этот ответ или мой другой ответ для примера в коде.

ИЗМЕНИТЬ

Чтобы сделать ячейку расширяемой в зависимости от количества строк, в didSelect установите количество строк метки на 0 и используйте следующий метод, чтобы указать tableView перерисовывать себя:

func refreshTableAfterCellExpansion() {
    self.tableView.beginUpdates()
    self.tableView.setNeedsDisplay()
    self.tableView.endUpdates()
}

Сделайте то же самое, только в обратном порядке, в didDeselect.

person Milan Nosáľ    schedule 16.01.2018
comment
В моем коде я не знаю, почему это не работает для меня. Если я использую return UITableViewAutomaticDimension в tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath), метки будут перекрываться в беспорядке. И кажется, что высота ячейки слишком мала. - person LF00; 16.01.2018
comment
ваши ограничения в ячейке не очень хороши, вы должны также ограничить метку слева, справа, сверху и снизу. Я думаю, вы не ограничили метку внизу - person Milan Nosáľ; 16.01.2018
comment
Я не знаю, как связать метку друг с другом, поэтому я просто поместил метку в раскадровку без ограничения конфигурации. я думаю это может быть причиной - person LF00; 16.01.2018
comment
@KrisRoofe делится кодом, в котором вы проектируете ячейку... или вы используете раскадровки для определения ее дизайна? - person Milan Nosáľ; 16.01.2018
comment
Я хочу сделать динамическую высоту дальше. Сначала я хочу оставить только 4 строки для метки дайджеста. Поэтому я установил cell.digest.numberOfLines = 4, и когда я выбираю ячейку, метка дайджеста в выбранной ячейке расширяется до полной высоты. Если я отменю выбор ячейки, метка сократится до 4 строк. Как я могу это сделать? Спасибо. - person LF00; 16.01.2018

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

person Shebuka    schedule 16.01.2018

Чтобы установить автоматическое измерение высоты строки и предполагаемой высоты строки, убедитесь, что следующие шаги позволяют сделать автоматическое измерение эффективным для макета высоты ячейки/строки. Я только что проверил следующие шаги и код и отлично работает.

  • Назначение и реализация tableview dataSource и делегата
  • Назначьте UITableViewAutomaticDimension для rowHeight и предполагаемойRowHeight
  • Реализовать методы делегата/источника данных (т.е. heightForRowAt и вернуть ему значение UITableViewAutomaticDimension)

-

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension
}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

Для экземпляра метки в UITableviewCell

  • Установить количество строк = 0 (и режим разрыва строки = обрезать конец)
  • Установите все ограничения (сверху, снизу, справа и слева) в отношении его контейнера superview/cell.
  • Необязательно: установите минимальную высоту для метки, если вы хотите, чтобы метка покрывала минимальную площадь по вертикали, даже если данных нет.

введите здесь описание изображения

Примечание. Если у вас есть более одной метки (UIElements) с динамической длиной, которая должна быть скорректирована в соответствии с размером ее содержимого: настройте «Приоритет сопротивления сопротивлению содержимому и сжатию» для меток, которые вы хотите расширить. /compress с более высоким приоритетом.

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

введите здесь описание изображения

person Krunal    schedule 16.01.2018