使用 RxSwift 在单元格点击时更改单元格高度

Change cell height on cell tap using RxSwift

我在我的应用程序中使用 RxSwift 来填充表格视图。目前数据显示成功。现在我想在单元格点击时更改单元格高度。这是我在单元格点击时所做的。

       _ = dataTable.rx.itemSelected
            .subscribe(onNext: { [weak self] indexPath in
//                let cell = self?.dataTable.cellForRow(at: indexPath) as? TradebookMyRequestCell

                if (self?.btnMyRequest.isSelected)!{
                    print("index Path \(Int(indexPath.row)) =")
                    if self?.selectedCellIndexPath != nil && self?.selectedCellIndexPath == indexPath {
                        //                selectedCellIndexPath = nil
                        self?.cellTapped = true
                    } else {
                        self?.selectedCellIndexPath = indexPath
                        self?.cellTapped = false
                    }

                    self?.dataTable.beginUpdates()

                    let selectedRowIndex = indexPath
                    self?.currentRow = selectedRowIndex.row
                    if !(self?.indexPaths.contains((self?.selectedCellIndexPath!)!))!{
                        self?.indexPaths.append((self?.selectedCellIndexPath!)!)
                    }
                    else {
                        let index = self?.indexPaths.index(of: (self?.selectedCellIndexPath!)!)
                        self?.indexPaths.remove(at: index!)
                    }
                    self?.dataTable.reloadRows(at: [indexPath], with: .fade)
                    self?.dataTable.endUpdates()
                }
        }).disposed(by: disposeBag)

这是改变单元格高度的代码

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        // cell = nil.
                if btnMyRequest.isSelected  {
                 if indexPaths.contains(indexPath) {
                    cellTapped = true
                        return 120
                    }
                    else {
                    cellTapped = false
                        return 70
                    }
                }else{
                    return 76
                }

    }

问题是当我点击单元格时,首先调用 heightforrow 方法然后触发我的单元格点击操作。由于我是 rx 的新手,谁能告诉我我做错了什么? 谢谢

我不得不处理这个问题。我的解决方案如下;向您的项目添加 "isExpanded" 属性 并在用户单击单元格时切换它。

tableView.rx.itemSelected.subscribe(onNext: toggleCell).disposed(by: disposeBag)

toggleCell 函数如下所示

func toggleCell(_ indexPath: IndexPath) {
    tableView.beginUpdates()
    let element = dataSource[indexPath]
    element.isExpanded = !element.isExpanded
    tableView.reloadRows(at: [indexPath], with: .automatic)
    tableView.endUpdates()
}

UITableView 的委托如下所示

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let item = dataSource[indexPath]
    if item.isExpanded {
        return 144
    }
    return 44
}

希望对您有所帮助。