Tableview 多节行数错误

Posted

技术标签:

【中文标题】Tableview 多节行数错误【英文标题】:Tableview Multi-Sections Number of Rows Error 【发布时间】:2020-04-04 07:13:42 【问题描述】:

我有以下四个产品列表:

var products1 = [Product]()
var products2 = [Product]()
var products3 = [Product]()
var products4 = [Product]()

我想要一个包含多个部分的 tableView,包括标题。添加标题没有错误,我没有问题;但是当它到达 numberofrows 时,它会给我一个错误。

这是我的numberOfSections

func numberOfSections(in tableView: UITableView) -> Int 

    var numberOfSections:Int = 1

    if orderDetails.status == DatabaseRef.Order_Received 
        numberOfSections = 1
    else
        if orderDetails.status == DatabaseRef.Picking 
            numberOfSections = 2
         else
            if orderDetails.status == DatabaseRef.ReadyForDelivery || orderDetails.status == DatabaseRef.OnTheWay || orderDetails.status == DatabaseRef.Delivered 
                numberOfSections = 4
    

    return numberOfSections

基本上基于订单的状态;我想要不同数量的部分(1 个部分、2 个部分或 4 个部分)。但我不断收到超出范围的错误。这就是我编码行数的方式:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        var numberOfRows = 0

        if orderDetails.status == DatabaseRef.Order_Received 
            numberOfRows = products1.count
        else

            if orderDetails.status == DatabaseRef.Picking 

                if section == 0 
                    numberOfRows = products1.count
                 else
                    if section == 1 
                        numberOfRows = products2.count
                

             else
                if orderDetails.status == DatabaseRef.ReadyForDelivery || orderDetails.status == DatabaseRef.OnTheWay || orderDetails.status == DatabaseRef.Delivered 
                    if section == 0 
                        numberOfRows = products1.count
                     else
                        if section == 1 
                            numberOfRows = products2.count
                         else
                            if section == 2 
                                numberOfRows = products3.count
                             else
                                if section == 3 
                                    numberOfRows = products4.count
                    
        
return numberOfRows
 

这是我的cellForRoaAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        if let cell = tableView.dequeueReusableCell(withIdentifier: Identifiers.MyOrderCartCell, for: indexPath) as?  MyOrderCartCell 

            if orderDetails.status == DatabaseRef.Order_Received 

                if indexPath.section == 0 
                    cell.configureCell(order: orderDetails, product: products1[indexPath.row], delegate: self)
                

             else
                if orderDetails.status == DatabaseRef.Picking 

                    if indexPath.section == 0 
                        cell.configureCell(order: orderDetails, product: products1[indexPath.row], delegate: self)
                     else
                        if indexPath.section == 1 
                            cell.configureCell(order: orderDetails, product: products2[indexPath.row], delegate: self)
                    

                 else
                    if orderDetails.status == DatabaseRef.ReadyForDelivery || orderDetails.status == DatabaseRef.OnTheWay || orderDetails.status == DatabaseRef.Delivered 

                        if indexPath.section == 0 
                            cell.configureCell(order: orderDetails, product: products1[indexPath.row], delegate: self)
                         else
                            if indexPath.section == 1 
                                cell.configureCell(order: orderDetails, product: products2[indexPath.row], delegate: self)
                             else
                                if indexPath.section == 2 
                                    cell.configureCell(order: orderDetails, product: products3[indexPath.row], delegate: self)
                                 else
                                    if indexPath.section == 3 
                                        cell.configureCell(order: orderDetails, product: products4[indexPath.row], delegate: self)
                        
            

我在这里做错了什么?错误信息是:

Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).

【问题讨论】:

为什么不使用一个带有状态字段的产品数组?它使您的方法变得容易。 一个订单的产品数量太多,所以在Product数组中为每个产品设置一个批准状态是不可行的。 【参考方案1】:

我发现上面的代码没有问题。我在其他地方遇到问题,将产品更新/添加到我没有添加到正确部分的表视图中。它只添加到第 0 节。所以上面的代码是正确的。

【讨论】:

以上是关于Tableview 多节行数错误的主要内容,如果未能解决你的问题,请参考以下文章

使用节标题和节行解析 JSON

每次我重新加载 tableview 部分时 UITableView 都不会向上滚动

致命错误:TableView 中的数组索引超出范围

加载 tableview 时应用程序崩溃并显示错误“无效更新:无效的节数”。

从 tableview 中删除一行

iPhone - Tableview 中的多线程 - 可行的方法?