iOS:如何在不使用第三方和MVC模式的情况下在Swift中创建可扩展的TableView?

时间:2018-01-25 12:32:18

标签: ios swift uitableview

我在swift中实现了Tableview,但是我想制作可扩展的TableView请给出这个想法..

这是Tableview的代码..

//MARK: - TableView Delegate and Datasource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return MenuNameArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MenuTableViewCell", for: indexPath) as! MenuTableViewCell
    cell.menuNameLabel.text = NameArray[indexPath.row]
    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

}

3 个答案:

答案 0 :(得分:1)

在这里,请尝试:-

struct ExpandableNames {
    var isExpanded : Bool
    var names : [String]
}

struct Contact {
    let names : String
}
  

在您的班级中->

var twoDArray = [

    ExpandableNames(isExpanded : true,names:["Krishna","Rishabh","Aditya","Chandan","Nipun","Navdeesh","Steve"].map
    {
            Contact(names: $0)
    }),
    ExpandableNames(isExpanded : true,names:["Carl","Michal","Tommy","Jennny","Vikram","Swati"].map
    {
            Contact(names: $0)
    }),
    ExpandableNames(isExpanded : true,names:["David","dude","dfff","dcc","daa","dee","dsss"].map
    {
        Contact(names: $0)

    }),
    ExpandableNames(isExpanded : true,names:[Contact(names: "Pattrick", hasFav: false)])

                ]

let cellId = "cellID"
let identifier = "attachmentCellID"

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
    return 50
}
func numberOfSections(in tableView: UITableView) -> Int
{

    return twoDArray.count

}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    if !twoDArray[section].isExpanded
    {
        return 0
    }
    return twoDArray[section].names.count
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{
    let btn = UIButton(type: .system)
    if(section == 0)
    {
        btn.setTitle("Tap To View Classes", for: .normal)
    }
    else if(section == 1)
    {
        btn.setTitle("Tap To View Admins", for: .normal)
    }

    btn.setTitleColor(.black, for: .normal)
    btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
    btn.addTarget(self, action: #selector(handleExpandClose), for: .touchUpInside)
    btn.backgroundColor = AppColors.greyBorderColor
    btn.tag = section
    return btn
}
@objc func handleExpandClose(button : UIButton)
{
    let section = button.tag

    var indexPaths = [IndexPath]()
    for row in twoDArray[section].names.indices
    {
        let indexPath = IndexPath(row: row, section: section)
        indexPaths.append(indexPath)
    }

    let isExpanded = twoDArray[section].isExpanded
    twoDArray[section].isExpanded = !isExpanded


    button.setTitle(isExpanded ? "Tap To View Classes" : "Classes", for: .normal)



    if isExpanded
    {
        tableView.deleteRows(at: indexPaths, with: .fade)
    }
    else
    {
        tableView.insertRows(at: indexPaths, with: .fade)

    }


}
  

然后在cellForRowAt中休息-

 let contact = twoDArray[indexPath.section].names[indexPath.row]
    cell.textLabel?.text = contact.names

答案 1 :(得分:0)

首先,您需要一个定义单元格是否打开的模型,例如,indexPaths数组:

var openPaths = [IndexPath]()

现在当选择你打开的单元格时,它是否打开并重新加载单元格

        if let index = openPaths.index(indexPath) {
            openPaths.remove(atIndex: index)
        } else {
             openPaths.append(indexPath)
        }

        tableView.beginUpdates()
        tableView.reloadRows(at: [indexPath], with: .automatic)
        tableView.endUpdates()

现在在您的单元格设置中,使用stackview,并在单元格配置中,根据单元格indexPath是否在openPaths

中隐藏可展开部分

答案 2 :(得分:0)

使用heightForRowAt委托方法更改单元格的高度: - 向对象添加布尔属性,例如isExpanded,更改值 {/ 1}}代表

didSelectRowAt