如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?

Posted

技术标签:

【中文标题】如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?【英文标题】:How to make Expandable with only Cells (NOT SECTION/ HEADER) with UITableView in Swift? 【发布时间】:2022-01-10 07:08:30 【问题描述】:

我研究了有关可扩展表格视图的所有 ***,但他们只发布了带有单元格的显示标题。事实上,ios 15 已经改变了 UITableView 的新设计界面,称为.insetGrouped

基本上.insetGrouped 中的标题对于 Expandable 来说真的很糟糕。我试图让我的想法是只使用单元格来做可扩展而不需要部分。

我的表在这里查看代码:

class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    
    struct Object 
        var seactionName: String!
        var seactionObjection: [String]!
        var footerName: String!
    
   
    var objectArray = [Object]()
    
    
    var TableView = UITableView()
    
    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        
        objectArray = [
            Object(seactionName: "Header", seactionObjection: ["Expandable Cell", "One Row", "Two Row"],
                   
                footerName: "Footer"),
        
            
            // copy and paste new cells
        ]
   
        title = "Help Center"
        
        view.backgroundColor = UIColor.quaternarySystemFill
    
        TableView.frame = view.bounds
       
        TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped)
        TableView.showsVerticalScrollIndicator = true
        TableView.indicatorStyle = .default
        TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List")
        
        TableView.delegate = self
        TableView.dataSource = self
        
        view.addSubview(TableView)
    
    


    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return objectArray[section].seactionObjection.count
    
    
    func numberOfSections(in tableView: UITableView) -> Int 
       
        return objectArray.count
        
    
    
        func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 

            return objectArray[section].seactionName

        



func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? 
    return objectArray[section].footerName

    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
  
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell
        
        cell.backgroundColor = .secondarySystemGroupedBackground
            cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row]
            cell.textLabel?.numberOfLines = 0
        
        return cell
    

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
    view.tintColor = .clear
    let header = view as! UITableViewHeaderFooterView
    header.textLabel?.textColor = UIColor.label




好吧,我可以更改此代码

cell.accessoryType = .disclosureIndicator

到这里

 let disclosureIndicatorTapped = UIImageView()
        disclosureIndicatorTapped.image = UIImage(systemName: "chevron.forward") // When tapped automatic to "Chevron.down"
        cell.accessoryView = disclosureIndicatorTapped

知道如何使用 Swift 在 UITableView 中获取可扩展单元格,而不需要页眉或页脚吗?

谢谢!

【问题讨论】:

不清楚你要做什么......你想要.insetGrouped的样子吗?或不?您想要每个部分的页眉和页脚吗?或者,您是否想要没有部分页眉/页脚,但您想点击部分中的第一行以展开/折叠该部分?如果您手动布局您希望表格的外观并发布它的屏幕截图,这可能会有所帮助。 我想要我的 TableView .insetgrouped。我不想以页脚为首展开/折叠。只有单元格可以像这样展开/折叠。 【参考方案1】:

您可以为您的对象添加一个布尔“扩展”属性。

numberOfRowsInSection 中,如果expanded 为True,则返回seactionObjection 中的项目数,否则返回1

然后,在didSelectRowAt 中,如果它是某个部分的第一行,则切换该部分对象的expanded 属性,然后重新加载该部分。

这是您的控制器类的修改版本:

class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    
    struct Object 
        var seactionName: String!
        var expanded: Bool!
        var seactionObjection: [String]!
        var footerName: String!
    
    
    var objectArray = [Object]()
    
    var TableView = UITableView()
    
    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        
        objectArray = [
            Object(seactionName: "Header 1",
                   expanded: false,
                   seactionObjection: ["Expandable Cell 1", "One Row 1", "Two Row 1"],
                   footerName: "Footer 1"),
            
            Object(seactionName: "Header 2",
                   expanded: false,
                   seactionObjection: ["Expandable Cell 2", "One Row 2", "Two Row 2"],
                   footerName: "Footer 2"),
            
            Object(seactionName: "Header 3",
                   expanded: false,
                   seactionObjection: ["Expandable Cell 3", "One Row 3", "Two Row 3"],
                   footerName: "Footer 3"),
            

            // copy and paste new cells
        ]
        
        title = "Help Center"
        
        view.backgroundColor = UIColor.quaternarySystemFill
        
        TableView.frame = view.bounds
        
        TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped)
        TableView.showsVerticalScrollIndicator = true
        TableView.indicatorStyle = .default
        TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List")
        
        TableView.delegate = self
        TableView.dataSource = self
        
        view.addSubview(TableView)
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // if section is expanded
        //  return count of seactionObjection
        // else
        //  return 1
        return objectArray[section].expanded ? objectArray[section].seactionObjection.count : 1
    
    
    func numberOfSections(in tableView: UITableView) -> Int 
        return objectArray.count
    
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return objectArray[section].seactionName
    
    
    func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? 
        return objectArray[section].footerName
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell
        
        cell.backgroundColor = .secondarySystemGroupedBackground
        cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row]
        cell.textLabel?.numberOfLines = 0
        
        // if it's the first row in a section,
        //  show accessoryView with
        //      chevron.up or chevron.down
        //  based on section Object expanded property
        if indexPath.row == 0 
            let chevronName = objectArray[indexPath.section].expanded ? "chevron.up" : "chevron.down"
            let img = UIImage(systemName: chevronName)
            let disclosureView = UIImageView(image: img)
            cell.accessoryView = disclosureView
         else 
            // not the first row in a section, so
            //  clear the accessoryView
            cell.accessoryView = nil
        
    
        return cell
    
    
    func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
        view.tintColor = .clear
        let header = view as! UITableViewHeaderFooterView
        header.textLabel?.textColor = UIColor.label
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        if indexPath.row == 0 
            objectArray[indexPath.section].expanded.toggle()
            tableView.reloadSections([indexPath.section], with: .automatic)
         else 
            // do something else on row selection
        
    
    

【讨论】:

我根据您的代码编写并了解如何工作!这更容易理解!非常感谢你,但是你忘记了这一点,你怎么能做.disclosureIndicator.disclosureIndicatorTapped 在点击单元格时显示,你会看到像cell.accessoryView 这样的右转。谢谢你! @AntonioAdrianChavez - 在cellForRowAt 中,根据.row 决定是设置还是清除.accessoryView,并根据部分对象的.expanded 属性决定使用哪个图像。我已经用一种方法编辑了我的答案,但我鼓励你先自己尝试一下……这可能是一次很好的学习体验。 顺便说一句:我知道那些 UITableViewController 基础代码很多年了,我使用了 UITableViewController。从 25 分钟开始,我就用你的简单代码更仔细地学习了。我开始明白了。 :) 嘿@DonMag,您认为建议使用带有 SF 符号的向上箭头和向下箭头,而不是向右箭头然后向下箭头? @AntonioAdrianChavez - 这是一个设计问题,所以这取决于您作为应用设计师。就个人而言,当我看到一个右 V 形时,我希望它“去某个地方”。当我看到左雪佛龙时,我希望它会“回去”。对于展开/折叠类型的功能,我希望有上/下 V 形...或者,标有“展开/折叠”的按钮...或“更多/更少”按钮...或其他东西。 好的,明白了。非常感谢您提供一些提示和有用的答案! :)

以上是关于如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用swift在ios中动态/编程添加多个UITableView? [关闭]

如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?

如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?

如何在 Swift 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?

Swift3,如何在不同的 viewController 中使用相同的 UITableView

如何使用关系 Swift 3 显示 UITableView