在uitableview swift4中展开和折叠多级部分

问题描述 投票:0回答:1

我想在tableview中展开和折叠多级数组,如下所示

  • CAT1 SubCat1 信息1 信息2 SubCat2 信息1 信息2 SubCat3 信息1 信息2
  • CAT2 SubCat1 信息1 信息2

为此我已经完成了以下代码。

struct CellData {
var opened = Bool()
var subCatTitle = String()
var subCatList = [String]()
}
struct MainModel {
var opened = Bool()
var categoryTitle = String()
var categoryList = [CellData]()
} 

我列了清单

 @IBOutlet var expandableThreeStageTableView: UITableView!
    var arrayList = [CellData]()
    var expandableList = [MainModel]()

func loadData(){
    arrayList.append(CellData(opened: false, subCatTitle: "SubCat1", subCatList: ["Info1","Info2","Info3"]))
    arrayList.append(CellData(opened: false, subCatTitle: "SubCat2", subCatList: ["Info1","Info2","Info3"]))
    arrayList.append(CellData(opened: false, subCatTitle: "SubCat3", subCatList: ["Info1","Info2"]))
    arrayList.append(CellData(opened: false, subCatTitle: "SubCat4", subCatList: ["Info1"]))

    expandableList.append(MainModel(opened: true, categoryTitle: "Cat1", categoryList: arrayList))
    expandableList.append(MainModel(opened: false, categoryTitle: "Cat2", categoryList: arrayList))
    expandableList.append(MainModel(opened: false, categoryTitle: "Cat3", categoryList: arrayList))
}

代理,数据源方法如下

extension TextFieldAsSearchVC : UITableViewDataSource{
func numberOfSections(in tableView: UITableView) -> Int {
        return expandableList.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: 
Int) -> Int {
        if expandableList[section].opened{
            if expandableList[section].categoryList[section].opened{
                return 
expandableList[section].categoryList[section].subCatList.count////which extra count should return here
            }else{
                print("COUNT ",expandableList[section].categoryList.count)
                return expandableList[section].categoryList.count + 
1///here +1 is for catname + subcatname

            }
        }else{
            return 1
        }
    }

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

        if indexPath.row == 0{
            let cell = 
expandableThreeStageTableView.dequeueReusableCell(withIdentifier: 
"TextFieldAsSearchVCCell", for: indexPath) as! TextFieldAsSearchVCCell
            cell.lblValue.text = 
expandableList[indexPath.section].categoryTitle
            return cell
        }else if indexPath.row <= 
expandableList[indexPath.section].categoryList.count{
             let cell = 
expandableThreeStageTableView.dequeueReusableCell(withIdentifier: 
"SectionDataCell", for: indexPath) as! SectionDataCell
            cell.rowLabel.text = 
expandableList[indexPath.section].categoryList[indexPath.row - 
1].subCatTitle
            return cell
        }
        else{
            let cell = 
expandableThreeStageTableView.dequeueReusableCell(withIdentifier: 
"SectionDataCell", for: indexPath) as! SectionDataCell
  cell.rowLabel.text = 

 expandableList[indexPath.section].categoryList[indexPath.row].
subCatList[indexPath.row]//how to access rows in subcategories
            return cell
        }
    }
}
extension TextFieldAsSearchVC : UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: 
IndexPath) {
        if indexPath.row == 0{
            if expandableList[indexPath.section].opened{
                expandableList[indexPath.section].opened = false
                //now reload the section
                let sections = IndexSet(integer: indexPath.section)
                expandableThreeStageTableView.reloadSections(sections, 
with: .automatic)
            }else{
                expandableList[indexPath.section].opened = true
                //now reload sections
                let sections = IndexSet(integer: indexPath.section)
                expandableThreeStageTableView.reloadSections(sections, 
with: .automatic)
            }

        }else {
            if 
expandableList[indexPath.section].categoryList[indexPath.row].opened{

expandableList[indexPath.section].categoryList[indexPath.row].opened = 
false
                expandableThreeStageTableView.reloadRows(at: 
[IndexPath(index: indexPath.row)], with: .automatic)
            }else{

expandableList[indexPath.section].categoryList[indexPath.row].opened = 
true
                expandableThreeStageTableView.reloadRows(at: 
[IndexPath(index: indexPath.row)], with: .automatic)
            }
        }
    }
}

从上面的代码我可以展开和折叠类别但不折叠子类别..当我试图点击子类别它给我一个错误

*** Terminating app due to uncaught exception 
'NSInternalInconsistencyException', reason: 'Invalid index path for use 
with UITableView. Index paths passed to table view must contain exactly 
two indices specifying the section and row. Please use the category on 
NSIndexPath in NSIndexPath+UIKitAdditions.h if possible.'

如何处理这种类型的逻辑?

ios swift uitableview collapse expand
1个回答
0
投票

您将获得此特定错误:

expandableThreeStageTableView.reloadRows(at: [IndexPath(index: indexPath.row)], with: .automatic)

一个IndexPath需要两个,一个row和一个section;你只提供一排。所以它应该是这样的:

expandableThreeStageTableView.reloadRows(at: [IndexPath(row: indexPath.row, section: indexPath.section)], with: .automatic)

如果你真的只需要重新加载当前的indexPath,只需像这样调用它:

expandableThreeStageTableView.reloadRows(at: [indexPath], with: .automatic)

这样可以解决您遇到的错误,但我不知道是否能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.