如果超过 indexpath.row,如何在表格视图中设置单元格行高?

Posted

技术标签:

【中文标题】如果超过 indexpath.row,如何在表格视图中设置单元格行高?【英文标题】:how to set cell row height in table view if it exceed its indexpath.row? 【发布时间】:2018-03-14 07:12:33 【问题描述】:

我正在尝试使用表格视图制作一个常见问题解答视图控制器,我需要在 UI 中进行一些修复。这是我现在的FAQ VC的显示

(请忽略红线)

我们可以看到,基本上有 2 行高,80 和 160。如果点击(选择)行,行高将从 80(黄线)扩展到 160(紫线)。

我想让最后一个问题下的行高仍然是80而不是160。我试过了,但我不能设置最后一个问题下的行。这是我使用的代码

class FAQVC: UIViewController 

    @IBOutlet weak var retryButton: DesignableButton!
    @IBOutlet weak var tableView: UITableView!

    var FAQs = [FAQ]()
    var selectedIndexs: [IndexPath: Bool] = [:]



    override func viewDidLoad() 
        super.viewDidLoad()

        getFAQData()


    



extension FAQVC : UITableViewDelegate, UITableViewDataSource 

    // MARK: - Table View Delegate and Datasource


    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return FAQs.count
    



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "FAQCell") as! FAQCell
        cell.FAQData = FAQs[indexPath.row]

        return cell
    



    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

        if self.cellIsSelected(indexPath: indexPath) 
          return 160
         else 
            return 80
        


    



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)

        let isSelected = !self.cellIsSelected(indexPath: indexPath)
        selectedIndexs[indexPath] = isSelected



        tableView.beginUpdates()
        tableView.endUpdates()
    


    func cellIsSelected(indexPath: IndexPath) -> Bool 
        if let number = selectedIndexs[indexPath] 
            return number
         else 
            return false
        
    


【问题讨论】:

为什么要在最后一个问题下设置行高?我认为您应该删除最后一个问题下的所有表格视图分隔符 @Alexa289,您可以使用 UITableAutomaticDimension 作为单元格高度,根据内容调整单元格高度。 @PPL yes 其实没必要,但是我有一个UI UX团队的投诉,最后一个问题下如何去掉表格视图分隔符? @Alexa289 请找到我的答案以删除多余的分隔符 【参考方案1】:

请将此代码放入控制器的 viewDidLoad() 方法中。

YOUR_TABLE_VIEW.tableFooterView = UIView(frame: .zero)

这将删除多余的分隔符。

【讨论】:

【参考方案2】:

最快的方法是在末尾添加一个额外的空单元格,行高为 80

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return FAQs.count + 1

另外,请确保您对 cellForRowAt 方法进行更改以适应这种情况:

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

     if indexPath.row < FAQs.count 
        let cell = tableView.dequeueReusableCell(withIdentifier: "FAQCell") as! FAQCell
        cell.FAQData = FAQs[indexPath.row]

        return cell
     
     return UITableViewCell()

编辑:

我刚刚读到您实际上不需要在最后一个单元格之后使用分隔符。在这种情况下看这里https://spin.atomicobject.com/2017/01/02/remove-extra-separator-lines-uitableview/

【讨论】:

以上是关于如果超过 indexpath.row,如何在表格视图中设置单元格行高?的主要内容,如果未能解决你的问题,请参考以下文章

indexPath.row 始终为 0

Swift 5. 从第二个表格视图单元格(第二个 indexpath.row )显示数组

在 TableView 中查找 [indexpath.row] 值

在 IBAction 中获取 indexPath.row?

UITableView:IndexPath.row 超出范围(致命错误)

点击单元格中的 UIImageView 时如何获取 indexpath.row?