嵌入在 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】:

通常,当表格视图从不向数据源询问单元格时,这是因为表格视图没有大小。我猜运行时计算,由于表格视图没有大小,它不能显示任何单元格,所以它不需要询问任何单元格。

在这种特殊情况下,您的表格视图位于垂直堆栈视图中。在某些配置中,堆栈视图取决于其排列的子视图的固有高度来知道如何调整它们的大小。例如,标签具有固有高度(其 intrinsicContentSizeheight)。

但是表格视图没有固有高度;你必须给它一个。否则,表格视图的高度将为零——这就是您看不到它的原因,也是不要求提供单元格的原因。

您要么需要对表格视图应用绝对高度约束,要么需要以确定高度的方式实现表格视图的intrinsicContentSize(或类似的)。然后堆栈视图将考虑到这一点,表格视图将具有高度,数据源将被要求提供单元格,您将开始在表格视图中看到一些东西。

【讨论】:

以上是关于嵌入在 UIStackView 中的 UITableView 不会重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 嵌入在 UIStackView 对齐中

在 UIScrollView 中嵌入 UIStackView 时出现的问题

带有 UIScrollview 的 UIStackView 中的多行标签

iOS/Swift:UITableViewCell 中的两个嵌入式视图在运行时未出现

UIStackView 和多行标签?

在 UIStackView 中增加 UIButton 的面积