如何手动加载UITableView

时间:2018-07-23 14:51:40

标签: ios swift uitableview uiview uikit

我这里的布局有点奇怪,有点像这样(另见图片):

-UITableViewCell 1

---- UIView 2

-------- UITableView 3

UITableView(1)的控制器是这样的:

    //mainTableView (1) controller

var cellHeights = [CGFloat]()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    let card = CardSource.orangeCards[indexPath.row]
    cell.configureCardInCell(card)
    cellHeights.insert(card.frame.height + 15, at: indexPath.row)
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return cellHeights[indexPath.row]
}

但是问题在于,当第一次加载屏幕时,由于单元格太小,因为较小的表格视图(UIView中的那个)尚未加载且高度尚未定义,因此UIViews重叠。证明是,当我滚动到主表视图的底部然后向后滚动时,再次调用cellForRowAt,并且两个视图不再重叠(请参见图片)。因此,我基本上想要的是一种加载较小的表视图并在加载较大的表视图之前定义其高度的方法(或者,如果您有任何其他解决方案,也欢迎这样做)

我知道我的问题不是很清楚,我并不是很擅长解释事物,所以请随时在评论中问我问题。

非常感谢!

When the view first loads

After scrolling down then back up

编辑:

我发现了:

    static var pharmacyOrangeCard: CardView {
    let view = Bundle.main.loadNibNamed("Pharmacy Orange Card", owner: self, options: nil)?.first as! PharmacyTableCardView
    print(view.frame.height)
    return view
}

打印正确的高度。但是,当我尝试从上面的控制器访问它时,它给了我一个较小的数字!同时,我应用了以下约束:

    self.translatesAutoresizingMaskIntoConstraints = false
    self.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 35).isActive = true        
    card.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true
    card.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true

但是我不认为这会影响身高,是吗?

编辑2:

好的,所以我更改了此约束:

self.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 35).isActive = true

对此:

    card.leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 17.5).isActive = true
    card.trailingAnchor.constraint(equalTo: cell.trailingAnchor, constant: -17.5).isActive = true

所以这些约束似乎起了作用,因为现在我有了这个: enter image description here

顺便说一句,我不知道这是否重要,但是我正在为每个“卡”使用XIB文件,并且高度不受限制,所以也许起到了作用?

解决编辑: 我通过以下方法解决了这个问题:

    override func viewDidAppear(_ animated: Bool) {
    mainTableView.reloadData()
}

1 个答案:

答案 0 :(得分:0)

一旦在屏幕上加载了单元格,就无法更改该单元格的高度以获得更好的UI体验,

在层次结构中,heightForRowAt在cellForRowAt之前被调用。

因此,您有2个选项来选择解决问题的方法

  • 首先:在表格视图尝试在其中加载单元格之前,先准备好高度值(在将委托和数据源值设置到tableView之前,先准备heights数组)
  • 秒::每当您需要更新tableView单元以相对于新的高度值重新建立时,每次在您更新高度值后都调用此

    yourTableView.reloadData()