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

时间:2016-02-19 21:41:58

标签: ios swift uitableview

我可以告诉我如何在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!

我在这里做错了什么?

2 个答案:

答案 0 :(得分:9)

尽量不要将所选标记用作切换单元格状态,例如此类。选择一个单元格后,再次点击它将不会取消选择。相反,您可以使用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()应该可以解决问题。

答案 1 :(得分:0)

斯威夫特 5.2

@objc func btn_hideunhidedes(sender:UIButton){ 让 index = sender.tag 让单元格:TVC_JoiningDetails = self.tv_JoiningDetails.cellForRow(at: IndexPath(row: index, section: 0)) as! TVC_加入详情

    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 部分: 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
    }
}

}