嵌入在 UIStackView 中的 UITableView 不会重新加载数据
Posted
技术标签:
【中文标题】嵌入在 UIStackView 中的 UITableView 不会重新加载数据【英文标题】:UITableView embedded in a UIStackView is not reloading data 【发布时间】:2020-10-01 15:12:01 【问题描述】:我有一个要填充数据的 tableView。但数据永远不会加载。委托方法 numberOfRowsInSection
被调用,但 cellForRowAt
没有被调用。
界面构建器
模拟器运行
XCode 控制台
查看调试器
谁能看出我做错了什么?
class ChargeDetailsView: UIView
@IBOutlet weak var chargesTable: UITableView!
@IBOutlet weak var tvSubtotalAmount: UILabel!
@IBOutlet weak var tvDiscountsAmount: UILabel!
@IBOutlet weak var tvTaxesAmount: UILabel!
@IBOutlet weak var tvGrandTotalAmount: UILabel!
private var allCharges:[ServiceLineItem] = []
class func instanceFromNib() -> UIView
return UINib(nibName: "ChargeDetailsView", bundle: Bundle(for: ChargeDetailsView.self)).instantiate(withOwner: nil, options: nil)[0] as! UIView
public override func awakeFromNib()
super.awakeFromNib()
print("ChargeDetailsView awakeFromNib")
self.chargesTable.delegate = self
self.chargesTable.dataSource = self
self.chargesTable.register(ServiceLineItemCell.nib(), forCellReuseIdentifier: ServiceLineItemCell.identifier)
self.tvSubtotalAmount.text = "-"
self.tvDiscountsAmount.text = "-"
self.tvTaxesAmount.text = "-"
self.tvGrandTotalAmount.text = "-"
public func configure(with details: GetReceiptDetails)
self.tvSubtotalAmount.text = "-"
self.tvDiscountsAmount.text = "-"
self.tvTaxesAmount.text = "-"
self.tvGrandTotalAmount.text = "-"
if let priceSubtotal = details.priceSubtotal
self.tvSubtotalAmount.text = String(format: "$%.02f", Double(priceSubtotal))
if let priceDiscount = details.priceDiscount
self.tvDiscountsAmount.text = String(format: "$%.02f", Double(priceDiscount))
if let priceTax = details.priceTax
self.tvTaxesAmount.text = String(format: "$%.02f", Double(priceTax))
if let priceTotal = details.priceTotal
self.tvGrandTotalAmount.text = String(format: "$%.02f", Double(priceTotal))
if details.pricing != nil, let items = details.pricing?.lineItems, items.count > 0
allCharges.removeAll()
allCharges.append(contentsOf: items)
print("allCharges total items: \(allCharges.count)")
self.chargesTable.reloadData()
extension ChargeDetailsView: UITableViewDelegate, UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
print("ChargeDetailsView numberOfRowsInSection: \(allCharges.count)")
return allCharges.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
print("row: \(indexPath.row)")
let cell = tableView.dequeueReusableCell(withIdentifier: ServiceLineItemCell.identifier) as! ServiceLineItemCell
cell.configure(with: allCharges[indexPath.row])
return cell
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
return UITableView.automaticDimension
【问题讨论】:
你必须给 tableview 高度限制 您确定您的表格视图有大小吗?我的经验是cellForRowAt
未被调用通常是因为表格视图的大小为零。运行应用程序并使用 View Debugger 进行检查;它会立即向您显示。
@matt 视图显示该表为空。我用调试器的屏幕截图更新了问题。
这样选择了表格视图后,在大小检查器中查看项目窗口的另一侧,看看它是否有大小。
好吧,表格视图没有神奇的固有高度。由您决定它的高度需要是多少,并指定它。这里已经讨论过很多次了,所以请搜索一下。这可能是一个不错的起点:***.com/questions/44852663/…
【参考方案1】:
通常,当表格视图从不向数据源询问单元格时,这是因为表格视图没有大小。我猜运行时计算,由于表格视图没有大小,它不能显示任何单元格,所以它不需要询问任何单元格。
在这种特殊情况下,您的表格视图位于垂直堆栈视图中。在某些配置中,堆栈视图取决于其排列的子视图的固有高度来知道如何调整它们的大小。例如,标签具有固有高度(其 intrinsicContentSize
的 height
)。
但是表格视图没有固有高度;你必须给它一个。否则,表格视图的高度将为零——这就是您看不到它的原因,也是不要求提供单元格的原因。
您要么需要对表格视图应用绝对高度约束,要么需要以确定高度的方式实现表格视图的intrinsicContentSize
(或类似的)。然后堆栈视图将考虑到这一点,表格视图将具有高度,数据源将被要求提供单元格,您将开始在表格视图中看到一些东西。
【讨论】:
以上是关于嵌入在 UIStackView 中的 UITableView 不会重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章
UIStackView 嵌入在 UIStackView 对齐中
在 UIScrollView 中嵌入 UIStackView 时出现的问题
带有 UIScrollview 的 UIStackView 中的多行标签