Search code examples
iosswiftuitableviewheightforrowatindexpath

Why in heightForRowAt method my cell is nil?


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if let cell = tableView.cellForRow(at: indexPath) as? ExpandablePlaneTableViewCell {
        return 400.0
    }

    return 75.0
}

I want to change size of my cell but inside of heightForRowAt it cannot see my cell and crashed. When I put there if let check it does not enter inside of the block and just takes 75.

Can anyone tell me what the problem is? It's too strange for me! I already set delegate to self. So it call the function but cannot detect my cell there.

UPDATE

In my ExpandablePlaneTableViewCell I have a variable:

var exapanded = false

Later in my ViewController: On click on the button in the cell I run my delegate method:

func expandViewButtonTapped(_ sender: ExpandablePlaneTableViewCell, for indexPath: IndexPath) {
    sender.exapanded = true
    tableView.reloadRows(at: [indexPath], with: .automatic)
}

and after I want to expand it and reload the cell

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

    cell.delegate = self
    cell.indexPath = indexPath

    return cell
}

Solution

  • Do not attempt to get a cell in heightForRowAt. And there certainly is no reason to do so in your case.

    You seem to want the height to be one value for certain types of cells and another height for other types.

    Simply use the same basic logic you have in cellForRowAt, based on the indexPath, to determine which height to return. In other words, base the decision on your data model, not on the cell.