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

时间:2017-01-09 00:12:56

标签: ios swift uitableview tableviewcell

我需要为每个table view cell设置一个特定的高度。高度取决于内容(= UITextFieldcell的高度)。

为了计算它的高度,我想创建一个" 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个对象(当我用表视图打开应用程序时,它们中有很多个)。这会产生任何负面影响吗?

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

  3. 如果您需要更多代码,请告诉我。我不确定,需要回答什么。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

您可以在UITableViewCell文件中创建类方法,并将文本传递给此方法,并返回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)
}