【问题标题】:TableView Automatic Dimension Tableview Inside TableviewTableView 自动维度 Tableview Tableview Inside Tableview
【发布时间】:2017-12-30 07:35:57
【问题描述】:

我有 Tableview 用于显示客户下的食品订单。其中包含水平UIStackview。在UIStackView

UIStackview 中很少有一个/两个内衬标签和一个UITableView 用于显示orderItems。内部表格视图具有固定的高度常数(大于或等于 + 750 优先级)并且将是 随内容大小而变化。高度和滚动禁用。

inner tableview 有两个标签。并且高度是自动尺寸

我希望主 tableview 单元格高度应根据内部 tableview 项目自动增加。所以我申请主tableview

    self.tblOrders.rowHeight = UITableViewAutomaticDimension
    self.tblOrders.estimatedRowHeight = 45

和在tableview单元子类中

override func awakeFromNib() {
    super.awakeFromNib()
    self.tblOrderMaster.dataSource = self
    self.tblOrderMaster.delegate = self

    self.tblOrderMaster.estimatedRowHeight = 45
    self.tblOrderMaster.rowHeight = UITableViewAutomaticDimension
    self.selectionStyle = .none
    self.layoutIfNeeded()

    self.tblOrderMaster.isScrollEnabled = false

}

内部tableview数据源数组

var orderData:[ODOrderDataMaster] = [] {
        didSet {
            self.tblOrderMaster.reloadData()
            self.layoutIfNeeded()
            self.const_Height_tblOrderMaster.constant = self.tblOrderMaster.contentSize.height
            self.layoutIfNeeded()

        }
    }

问题:当我滚动主表视图时,它没有按照子项正确调整大小。虽然最初它显示正确。

我几乎尝试过所有类似 layoutIfNeeded 的方法。布局子视图。设置需求显示。

我也实现了 willDisplayCell 但没有成功。

我认为问题是当我重新加载内部表格视图时。当它完成重新加载时,我如何通知主 tableview 以及如何更新内部 tableview 的高度常数

如果有人需要更多信息,请告诉我。

感谢任何帮助或建议

【问题讨论】:

  • 你说内部 tableView 的高度是静态的,在代码中它是动态的
  • 不! @Sh_Khan 一切都是动态的。内部表格视图数据不是静态的
  • 你的意思是内部 tableView 最初是隐藏的,当点击主单元格中的按钮时,它会显示或从头开始显示
  • @Sh_Khan 没有隐藏表格视图。我在屏幕上都有两个 tableview 可见。当我滚动主表视图时,单元格高度不会根据内部表视图的内容大小精确增加
  • 您能否创建最小的示例项目来重现相同的行为。这将是调试问题的良好开端

标签: ios swift uitableview uitableviewautomaticdimension


【解决方案1】:

在 main & inner tableViews 的 cellForRowAt 末尾之前添加这两行

  cell.layoutSubviews()

  cell.layoutIfNeeded()

  return cell

您也可以尝试在主单元子类中添加 layoutSubviews 方法并执行此操作

  self.tblOrderMaster.layoutIfNeeded()

并在主tableView的控制器的viewDidLayoutSubviews中执行此操作

  self.tblOrders.layoutIfNeeded()

【讨论】:

  • 你可以在 orderData didSet 和测试中评论代码吗??
  • 这是重新加载内部表格视图的代码!并设置内容大小
  • 你在主 TableView 的 cellForRowAt 中设置了这个数组?
  • 尝试为内部 tableView 单元格设置固定高度,因为我认为如果其他解决方案失败,外部和内部 tableview 之间的动态高度同步存在问题
【解决方案2】:

尝试将其添加到 tblOrders 中:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.contentView.setNeedsLayout()
    cell.contentView.layoutIfNeeded()
}

【讨论】:

    【解决方案3】:

    你为什么不根据内部 tableView 的行数来做,例如假设你的内部 tableview 的 rowheight 为 30 点,而不是设置 parenttableview 的 rowheight 你所要做的就是乘以孩子的行数按行高的 tableview,你会得到你想要的。

    【讨论】:

    • 除了这个黑客之外,没有一个答案对我有用!非常感谢:)
    • 很高兴你发现它很有用。
    【解决方案4】:

    我已经尝试了几乎所有可能的解决方案,但每个都有一些问题。所以我找到了另一种解决方法来解决这个问题它不能被称为完美的解决方案,但是它对我有用

    在表格视图单元格中,我添加了一个 隐藏标签,它是顶部:0,底部:0,左侧:0 和右侧:0

    现在

        // This is temp label which help to calulate height to tableview
        if let orderMaster = restObj.orderDataMaster {
    
            var tempText = ""
            for orderMasterObject in orderMaster {
    
                tempText += (orderMasterObject.item?.name ?? "") + "\n" + "  "
    
                if let subItems = orderMasterObject.masterSubitem {
    
                    let result = subItems.reduce("", { (result, subItem) -> String in
                        return result +  (subItem.subitem?.name ?? "") + ","
                    })
                    tempText += result + "\n" + "  "
    
                }
                tempText += "\n"
            }
            cell.lblTemp.text = tempText
        }
    
        self.view.layoutIfNeeded()
        cell.setNeedsLayout()
        cell.delegate = self 
    

    这里所做的是,内部表格视图的单元格具有根据文本增长的标签。因此,在我的情况下,该临时标签具有相同的文本 (masterSubitem),简而言之,我已经在该标签中复制了内部 tableview 单元格,因为我们提供了所有四个约束标签,因此当它增长时,我们的 tableview 单元格将随之增长。

    希望对遇到同样问题的人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 2017-06-29
      • 1970-01-01
      • 2020-05-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多