1

Issue: When I scroll the tableView, my configureCell() method appends too many views to the stackView inside the cell.

When the cell is first displayed, and I press the UIButton, the stack is unhidden and first shows the right amount of views, after scrolling, the amount is duplicated.

prepareForReuse() is empty right now. I want to keep the stackView unHidden after scrolling.

I set the heightAnchor for the UIView as it is programmatic layout.

Expected Outcome: User taps on the button, the cell stackView is unhidden and the cell expands to chow the uiviews related to the cell.

When I call it in the cellForRowAt, nothing happens. Because im not sure how to modify the method for IndexPath.row.

protocol DataDelegate: AnyObject {
    func displayDataFor(_ cell: TableViewCell)
}
class TableViewCell: UITableViewCell {
@IBOutlet weak var stackView: UIStackView! {
   didSet {
      stackView.isHidden = true
          }
 }
@IBOutlet button: UIButton!
var model = Model()
var detailBool: Bool = false

   @IBAction func action(_ sender: Any) {
        self.claimsDelegate?.displayClaimsFor(self)
        detailBool.toggle()
    }

    func configureCellFrom(model: Model) {
        if let addedData = model.addedData {
            if addedData.count > 1 {
                for data in addedData {
                    let dataView = DataView()
                    dataView.heightAnchor.constraint(equalToConstant: 65).isActive = true
                    dataView.dataNumber.text = data.authDataNumber
                    self.stackView.addArrangedSubview(dataView)
          }
        }
      }
    }
}

How would I call this in cellForRowAt, so its only created the correct amount of uiviews and not constantly adding?

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as? TableViewCell else {
            return UITableViewCell()
        }
 
        cell.dataDelegate = self
        cell.configureCellFrom(model: model[indexPath.row])
        
           //if let addedData = model.addedData {
           //if addedData.count > 1 {
                //for data in addedData {
                    //let dataView = DataView()
                    //dataView.heightAnchor.constraint(equalToConstant: 65).isActive = true
                    //dataView.dataNumber.text = data.authDataNumber
                    //self.stackView.addArrangedSubview(dataView)
        // }}}
        cell.layoutIfNeeded()
        cell.selectionStyle = .none
        return cell
    }



extension ViewController: DataDelegate {
    func displayDataFor(_ cell: TableViewCell) {
        if tableView.indexPath(for: cell) != nil {
            switch cell.detailBool {
            case true:
                UIView.performWithoutAnimation {
                    tableView.beginUpdates()
                    cell.detailArrow.transform = CGAffineTransform(rotationAngle:.pi)
                    cell.stackView.isHidden = false
                    tableView.endUpdates()
                }
            case false:
                UIView.performWithoutAnimation {
                    tableView.beginUpdates()
                    cell.stackView.isHidden = true
                    cell.detailArrow.transform = CGAffineTransform.identity
                    tableView.endUpdates()
                }
            }
        }
    }
}
jayskev
  • 23
  • 4

1 Answers1

0

If I understand correctly, you would like to create an expandable TableView? If yes you can do it a lot of different ways, but you have to change your approach totally. Please refer LBTA approach: LBTA video

My favourite the Struct approach, where you create a struct and you can save the complication with the 2D array: Struct stackoverflow link