UITableView:单击按钮时如何动态更改单元格高度?迅速

Posted

技术标签:

【中文标题】UITableView:单击按钮时如何动态更改单元格高度?迅速【英文标题】:UITableView: How to change cell height dynamically when a button is clicked in it? Swift 【发布时间】:2016-02-19 21:41:57 【问题描述】:

我可以从here 告诉我如何在objective-c 中执行此操作,但是如何将其转换为swift?

我有一个带有自定义 TableViewCells 的 UITableView,它有一个名为“expandButton”的 UIButton。我试图弄清楚当单击该单元格的 expandButton 时如何更改该特定单元格的高度。

另外,当再次点击它时,它应该变回原来的大小。 我不熟悉 ObjectiveC,所以请在 Swift 中帮助我。提前致谢!

这是我目前所拥有的:

    //Declaration of variables as suggested
        var shouldCellBeExpanded:Bool = false
        var indexOfExpendedCell:NSInteger = -1

现在在 ViewController 中。注意:TableViewCell 是我的自定义单元格的名称。

    //Inside the ViewController
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    if let cell:TableViewCell = TableViewCell() 

        cell.stopWatch = stopWatchBlocks[indexPath.row]

        cell.expandButton.tag = indexPath.row

        //Adding action to the expand button
        cell.expandButton.addTarget(self, action: "expandButtonAction1:", forControlEvents: UIControlEvents.TouchUpInside)

        return cell

    


现在,按钮操作方法:

    func expandButtonAction1(button:UIButton) 

    button.selected = !button.selected

    if button.selected 

        indexOfExpendedCell = button.tag
        shouldCellBeExpanded = true

        self.TableView.beginUpdates()
        self.TableView.reloadRowsAtIndexPaths([NSIndexPath(forItem: indexOfExpendedCell, inSection: 0)], withRowAnimation: .Automatic)
        self.TableView.endUpdates()

        button.setTitle("x", forState: UIControlState.Selected)
    

    else if !button.selected 

        indexOfExpendedCell = button.tag
        shouldCellBeExpanded = false

        self.TableView.beginUpdates()
        self.TableView.reloadRowsAtIndexPaths([NSIndexPath(forItem: indexOfExpendedCell, inSection: 0)], withRowAnimation: .Automatic)
        self.TableView.endUpdates()

        button.setTitle("+", forState: UIControlState.Normal)
    

最后是 HeightForRowAtIndexPath

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

    if shouldCellBeExpanded && indexPath.row == indexOfExpendedCell 
        return 166.0
    
    else  return 91.0 

我认为我遗漏了一些东西,因为单击一次时单元格确实会扩展,但它不会“缩小”回 91!

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

尽量不要将选定的标签用作这样的单元格状态的切换。一旦选择了一个单元格,再次点击它不会取消选择。相反,您可以只使用 shouldCellBeExpanded 标志:

func expandButtonAction1(button:UIButton) 

    shouldCellBeExpanded = !shouldCellBeExpanded
    indexOfExpendedCell = button.tag

    if shouldCellBeExpanded 
        self.TableView.beginUpdates()
        self.TableView.endUpdates()

        button.setTitle("x", forState: UIControlState.Normal)
    

    else 
        self.TableView.beginUpdates()
        self.TableView.endUpdates()

        button.setTitle("+", forState: UIControlState.Normal)
    

另外,根据我的经验,reloadRowsAtIndexPath 方法是不必要的。除非您需要自定义动画,否则单独使用 beginUpdates() 和 endUpdates() 应该可以解决问题。

【讨论】:

太棒了!感谢您的提示和答案。效果很好! 现在查看此内容的任何人都知道您的 IBOutlet 'expandButton' 在您的 tableview 单元格类中,而您的操作按钮 'expandButtonAction1' 在您的 tableview 类的视图控制器类中。您可以在“addTarget”调用中使用#selector(expandButtonAction1) 将@objc 添加到您的操作按钮功能中。 '.Normal' 也是 '.normal'【参考方案2】:

斯威夫特 5.2

@objc func btn_hideunhidedes(sender:UIButton) 让 index = sender.tag 让单元格:TVC_JoiningDetails = self.tv_JoiningDetails.cellForRow(at: IndexPath(row: index, section: 0)) 为! TVC_JoiningDetails

    shouldCellBeExpanded = !shouldCellBeExpanded
    indexOfExpendedCell = index
    
    if shouldCellBeExpanded 
        self.tv_JoiningDetails.beginUpdates()
        self.tv_JoiningDetails.endUpdates()
        cell.btn_View.setTitle("X", for: .normal)
    
    else 
        self.tv_JoiningDetails.beginUpdates()
        self.tv_JoiningDetails.endUpdates()
        cell.btn_View.setTitle("+", for: .normal)
    

扩展 VC_JoiningProgram : UITableViewDelegate,UITableViewDataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 返回 2

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TVC_JoiningDetails") as! TVC_JoiningDetails
    cell.btn_View.tag = indexPath.row
    cell.btn_View.addTarget(self, action: #selector(btn_hideunhidedes), for: .touchUpInside)
    return cell


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    if shouldCellBeExpanded && indexPath.row == indexOfExpendedCell 
        return 324
    
    else 
        return 264
    

【讨论】:

虽然这可能会解决问题,但对 OP 提供一些解释直接回答他们的问题“我在这里做错了什么?”会更有帮助

以上是关于UITableView:单击按钮时如何动态更改单元格高度?迅速的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时将单元格动态添加到 UItableview

在单元格内单击时找出 UITableView 中的哪个部分按钮

如何通过按下 iPhone 中的按钮将行/单元格动态添加到 UITableView

在 UITableView 中单击时更改 UIButton 颜色和文本

如何更新动态生成的故事板中的自定义特定 UITableview 单元格?

uitableview 单元格突出显示