tableView.dequeueReusableCell() 在 tableRow(_:heightForRowAt:) 方法中

tableView.dequeueReusableCell() inside of tableRow(_:heightForRowAt:) method

我需要为每个 table view cell 指定一个特定的高度。高度取决于内容(=cell里面的UITextField的高度)。

为了计算它的高度,我想创建一个 "prototypeCell" 并向其中添加文本以获得所需的高度。这是我唯一需要这个创建的单元格的东西。我试过这个:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        let entry = fetchedResultsController.object(at: indexPath)

        guard !entry.isFault else { // some entries are faults, somehow
            return 0
        }

        let prototypeCell = tableView.dequeueReusableCell(withIdentifier: "bitCell") as! BitCell
        prototypeCell.configure(entry: entry) // add text and stuff

        // .cellContentHeight calculates the height I need for the cell
        return prototypeCell.cellContentHeight + baseRowHeight
    }

我有两个问题:

  1. 我跳过了所有 entry 错误的对象(当我使用 table 视图打开应用程序时,有很多错误)。这有什么负面影响吗?

  2. 我可以在此方法中使用 tableView.dequeueReusableCell() 吗?据我了解,它使现有单元格出列并创建一个新单元格。但之后我有点把这个细胞扔掉了。这不好吗?

如果您需要更多代码,请告诉我。我不确定,需要什么来回答这个问题。

提前致谢!

您可以在您的 UITableViewCell 文件中创建 class 方法并将文本传递给此方法并返回 CGFloat 以获取单元格高度。 我为带有标签的单元格编写了此方法,但如果需要,您可以将其与 UITextField 一起使用

class func suggestedHeight(text:String) -> CGFloat{
    let label = UILabel(frame:CGRectMake(0,0,UIScreen.mainScreen().bounds.size.width - LABEL_LEFT_AND_RIGHT_PADDING,1))
    label.font = UIFont(name: "Regular", size: 14)
    label.numberOfLines = 0
    label.text = text
    label.sizeToFit()
    return TOP_PADDING + label.frame.height
}

然后在 heightForRow

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let entry = fetchedResultsController.object(at: indexPath)
    return BitCell.suggestedHeight(text:entry)
}