Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 嵌入在UIStackView中的UITableView不会重新加载数据_Ios_Swift_Uitableview_Uistackview - Fatal编程技术网

Ios 嵌入在UIStackView中的UITableView不会重新加载数据

Ios 嵌入在UIStackView中的UITableView不会重新加载数据,ios,swift,uitableview,uistackview,Ios,Swift,Uitableview,Uistackview,我有一个tableView,我正试图用数据填充它。但数据从未加载。调用委托方法numberOfRowsInSection,但不调用cellForRowAt 界面生成器 模拟器运行 XCode控制台 视图调试器 有人能看出我做错了什么吗 class ChargeDetailsView: UIView { @IBOutlet weak var chargesTable: UITableView! @IBOutlet weak var tvSubtotalAmount: U

我有一个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
    }
}

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

在这种特殊情况下,表视图位于垂直堆栈视图内。在某些配置中,堆栈视图取决于其排列的子视图的固有高度,以了解如何调整其大小。例如,标签具有固有的高度(其
intrinsicContentSize
height

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


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

通常,当表格视图从不向数据源输入单元格时,这是因为表格视图没有大小。我猜运行时认为,由于表视图没有大小,它不能显示任何单元格,因此它不需要请求任何单元格

在这种特殊情况下,表视图位于垂直堆栈视图内。在某些配置中,堆栈视图取决于其排列的子视图的固有高度,以了解如何调整其大小。例如,标签具有固有的高度(其
intrinsicContentSize
height

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


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

您必须为表视图提供高度约束您确定表视图具有大小吗?我的经验是,
cellForRowAt
没有被调用通常是因为表视图的大小为零。运行应用程序并使用视图调试器进行检查;它将立即向您显示。@matt视图显示表是空的。我用调试器的屏幕截图更新了这个问题。表视图没有神奇的固有高度。这取决于你决定它的高度,并具体说明。这已经在这里讨论过很多次了,所以做一个搜索。这可能是一个很好的起点:@matt谢谢你的帮助!您必须为TableView设置高度约束您确定您的TableView具有大小吗?我的经验是,
cellForRowAt
没有被调用通常是因为表视图的大小为零。运行应用程序并使用视图调试器进行检查;它将立即向您显示。@matt视图显示表是空的。我用调试器的屏幕截图更新了这个问题。表视图没有神奇的固有高度。这取决于你决定它的高度,并具体说明。这已经在这里讨论过很多次了,所以做一个搜索。这可能是一个很好的起点:@matt谢谢你的帮助!