在swift3中,只有单个单元格在UITableViewCell中展开

时间:2017-09-10 16:46:32

标签: ios swift uitableview

我正在通过单击自定义表格单元格中的按钮来实现可扩展和可折叠的表格单元格。我尝试了以下代码,但它一次只扩展单个单元格。也就是说,如果我单击它展开的单元格,但如果我单击另一个单元格,它会展开,并且已经展开的单元格会折叠。

var selectedIndexPath: IndexPath?

func configure(cell: MyProposalCustomCell, forRowAtIndexPath indexPath: IndexPath) {
    let pool = myProposalsDetails[indexPath.row]
    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsets.zero
    cell.layoutMargins = UIEdgeInsets.zero
    cell.proposalNumber.text = pool.proposalNumber
    cell.pickUpLocation.text = pool.pickupLocation
    cell.dropLocation.text = pool.dropLocation
    cell.journeyType.text = pool.journeyType
    cell.firstShiftOnwardTime.text = pool.firstPickupTime
    cell.firstShiftReturnTime.text = pool.firstEndTime
    if let numberOfInterests = pool.noOfInterest {
        cell.numberOfInterest.text = String(numberOfInterests)
    }

    if let operatingDays = pool.operatingDays {
        cell.daysOfOperation.attributedText = Utility.getProposedOperatingDays(operatingDays: operatingDays)
    }
    cell.expandCollapse.tag = indexPath.row
    cell.expandCollapse.addTarget(self, action: #selector(expandTableCell(sender:)), for: .touchUpInside)
    if selectedIndexPath == indexPath {
        UIView.animate(withDuration: 0.3, animations: {
            cell.backgroundColor = CustomColor.selectedBackground.color
            cell.bottomView.backgroundColor = CustomColor.selectedBackground.color
            cell.expandCollapse.setImage(UIImage(named: "collapse_arrow.png"), for: .normal)
            if let proposedStartDate = pool.startDate {
                let propStartDate = Date(timeIntervalSince1970: proposedStartDate)
                cell.proposedStartDate.text = Utility.getFormattedDate(date: propStartDate)
                cell.proposedStartDateTxt.text = NSLocalizedString("Proposed start date", comment: "")
            }
            cell.returnTime.alpha = 0.0
        })
    } else {
        UIView.animate(withDuration: 0.3, animations: {
            cell.backgroundColor = UIColor.white
            cell.expandCollapse.setImage(UIImage(named: "down_arrow.png"), for: .normal)
            cell.proposedStartDateTxt.text = NSLocalizedString("Journey type", comment: "")
            cell.bottomView.backgroundColor = UIColor.white
            cell.proposedStartDate.text = pool.journeyType
            cell.returnTime.isHidden = false
        })
    }
}

这是可扩展的按钮操作:

func expandTableCell(sender: UIButton) {
    let indexPath = IndexPath(row: sender.tag, section: 0)
    if selectedIndexPath == indexPath {
        selectedIndexPath = nil
    } else {
        let previousSelIndex = selectedIndexPath
        selectedIndexPath = indexPath
        if let previousSelectedIndexPath = previousSelIndex {
            if tripStatus.tripType != .splitShift {
                if let previousSelectedCell = myProposals.cellForRow(at: previousSelectedIndexPath)   as? MyProposalCustomCell {
                    configure(cell: previousSelectedCell, forRowAtIndexPath: previousSelectedIndexPath)
                }
            } else {
                if let previousSelectedCell = myProposals.cellForRow(at: previousSelectedIndexPath)   as? MyProposalSplitShiftCell {
                    configureSplitShift(cell: previousSelectedCell, forRowAtIndexPath: previousSelectedIndexPath)
                }
            }
        }
    }
    updateSelectedCell(indexPath: indexPath)
    myProposals.beginUpdates()
    myProposals.endUpdates()
}

func updateSelectedCell(indexPath: IndexPath) {
    if tripStatus.tripType != .splitShift {
        if let selectedCell = myProposals.cellForRow(at: indexPath) as? MyProposalCustomCell {
            configure(cell: selectedCell, forRowAtIndexPath: indexPath)
        }
    } else {
        if let selectedCell = myProposals.cellForRow(at: indexPath) as? MyProposalSplitShiftCell {
            configureSplitShift(cell: selectedCell, forRowAtIndexPath: indexPath)
        }
    }
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    let headingHeight: CGFloat = 128
    let detailsHeight: CGFloat = 80
    let splitShiftDetailsHeight: CGFloat = 215

    switch tripStatus.tripType {

    case .oneWayTrip, .roundTrip:
        if selectedIndexPath != nil && indexPath.compare(selectedIndexPath! as IndexPath) == ComparisonResult.orderedSame {
            return headingHeight + detailsHeight
        }
        return headingHeight

    case .splitShift:
        if selectedIndexPath != nil && indexPath.compare(selectedIndexPath! as IndexPath) == ComparisonResult.orderedSame {
            return headingHeight + splitShiftDetailsHeight
        }
        return headingHeight
    }
}

我希望扩展多个单元格。怎么做到这一点?

1 个答案:

答案 0 :(得分:0)

这是非常直接的,而不是采用 selectedIndexPath 尝试在自定义UITableViewCell类中保留一个变量,例如,

class ExpandableCell: UITableViewCell {

    var isExpanded: Bool = false

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func moreButtonTapped(_ sender: Any) {
    }
}

然后尝试切换 isExpanded 布尔标志,并尝试执行func updateSelectedCell(indexPath: IndexPath) {}操作。