ios - 如何手动加载 UITableView

标签 ios swift uitableview uiview uikit

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

-UITableViewCell 1

----UIView 2

--------UITableView 3

UITableView(1)的 Controller 是这样的:

    //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]
}

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

我知道我的问题不是很清楚,我不太擅长解释,所以不要犹豫,在评论中问我问题。

非常感谢!

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
}

打印出正确的高度。但是,当我尝试从上面的 Controller 访问它时,它给了我一个较小的数字!与此同时,我应用了这些约束:

    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()
}

最佳答案

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

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

所以你有 2 个选项可以选择来解决你的问题

  • 首先::在 TableView 尝试加载其中的单元格之前准备好高度值(在将委托(delegate)和数据源值设置到 TableView 之前准备好高度数组)
  • second::每当您需要更新 tableView 单元格以根据新的高度值重新建立时,每次在您更新高度值后调用它

    yourTableView.reloadData()

关于ios - 如何手动加载 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481703/

相关文章:

ios - UISearchBar 在向下滚动之前不可见

ios - 带有游戏套件的移动平台

swift - 将字符串转换为日期会中断本地时间

ios - 在回调中使用函数/在单元格内使用 SegmentedControl

IOS:仅使用多点触控缩放 uiscrollview

ios - 当应用程序处于后台或被杀死时如何定期获取新位置

ios - 对 iOS 上的 Google Places API 的请求返回 REQUEST_DENIED

ios - 是否可以使用 Xcode 使游戏 Controller 振动?

ios - 为什么表格 View 滚动滞后?

ios - 如何过滤 TableView 单元格以便过滤掉的单元格不会出现?