选中时,展开的tableview单元格数据将被覆盖

时间:2017-02-14 04:21:48

标签: ios uitableview swift3

我有一个交易表格视图,其中包含不同类型的费用,这些费用会在选定时展开以显示更多详细信息。

然而,当发生这种情况时,细节似乎会被覆盖。我可以看到它闪烁,有时它会填充。文本字段正确填充。我一直试图调试这个,但不知道如何解决这个问题。

这是我目前的实施:

// MARK: Tableview
extension TransactionViewController: UITableViewDelegate, UITableViewDataSource {
    // MARK: - Table View

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "CardCell", for: indexPath) as! CardTableViewCell

        cell.delegate = self

        var isDetailHidden = true
        if indexPath.row == rowSelected {
            isDetailHidden = false
        }
        let transaction = transactionList[indexPath.row]
        cell.configureCell(transaction: transaction, isDetailHidden: isDetailHidden)

        return cell
    }

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

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if indexPath.row == rowSelected {
        // don't refresh and set again.
        return
    }

    rowSelected = indexPath.row
    transactionBeingEdited = transactionList[indexPath.row]

    transactionTableView.setContentOffset(CGPoint(x: 0, y: rowSelected! * 76), animated: true)

    let cell = tableView.dequeueReusableCell(withIdentifier: "CardCell", for: indexPath) as! CardTableViewCell

    cell.delegate = self
    cell.configureDetailCell()
    transactionTableView.reloadData()
}

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        let transaction = transactionList[indexPath.row]
        coreDataManager.deleteTransaction(transaction: transaction)
    }

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

        if indexPath.row != rowSelected {
            return 76.5
        } else {
            return 323
        }
    }

详细信息部分中的变量是使用库的下拉框。我在UITableViewCell类中配置了它。设置下拉方法发生在awakefromnib方法中。

private func setupBillDropDown() {
        billDropDown.anchorView = bill
        billDropDown.bottomOffset = CGPoint(x: 0, y: bill.bounds.height)
        billDropDown.dataSource = TransactionType.list

        // Action triggered on selection
        billDropDown.selectionAction = { [unowned self] (index, item) in
            self.bill.setTitle(item, for: .normal)
            self.bill.setTitleColor(UIColor.white, for: .normal)

            // Update transaction
            if let transactionBeingEdited = self.delegate?.transactionBeingEdited {
                transactionBeingEdited.type = item
                self.coreDataManager.saveToCoreData()
                self.coreDataManager.nc.post(name: .transactionBeingEdited, object: nil, userInfo: nil)
            }
        }
    }

提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为在func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath)中,您通过加载表来覆盖已配置的单元格。试试这个:

func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){

if indexPath.row == rowSelected {
    // don't refresh and set again.
    return
}

rowSelected = indexPath.row
transactionBeingEdited = transactionList[indexPath.row]

transactionTableView.setContentOffset(CGPoint(x: 0, y: rowSelected! * 76), animated: true)

//let cell = tableView.dequeueReusableCell(withIdentifier: "CardCell", for: indexPath) as! CardTableViewCell

let cell = tableView.cellForRow(at: indexPath)
cell.configureDetailCell()
tableView.reloadRows(at: [indexPath], with: .none)

}

答案 1 :(得分:0)

我花了几个小时的时间才弄明白这个问题...这是因为我正在使用

更新按钮标题
bill.titleLabel!.text = transaction.type ?? "Select Bill"

insteaad

bill.setTitle(transaction.type ?? "Select Bill", for: .normal)