UIVIewController Not Getting Deinitialized When Popping

56 Views Asked by At

I am building a settings screen in an app where I have a list of cells. If a user taps on a cell it pushes another controller onto the stack. However, I have this flow in several places in my app.

Therefore, I decided to reuse a generic controller and initialize it with sections (depending on which cell was tapped)

However, when popping a UIViewController it isn't getting deinitialized

VIEW CONTROLLER CODE

// Class    
class ProfileController: UIViewController {
    
private let authService: AuthSerivce
private let sections: [FormSectionComponent]
init(authService: AuthSerivce,
     sections: [FormSectionComponent]) {
    self.authService = authService
    self.sections = sections
    super.init(nibName: nil, bundle: nil)
    }
}
// Cell Delegate
extension ProfileController: NavigateCellDelegate {
    
func navigate(cell: NavigateCell) {
    guard let sections = cell.item?.components else { return }
    let controller = ProfileController(authService: authService, sections: sections)
    self.navigationController?.pushViewController(controller, animated: true)
    }
}

CELL CODE

protocol NavigateCellDelegate {
    func navigate(cell: NavigateCell)
}
class NavigateCell: UICollectionViewCell {
    
    var item: NavigateComponent?
    var delegate: NavigateCellDelegate?
    
    lazy var titleLabel: UILabel = {
        let view = UILabel()
        view.numberOfLines = 0
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
    
    override init(frame: CGRect) {
        super.init(frame: .zero)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func bind(_ item: FormItemComponent) {

        guard let item = item as? NavigateComponent else { return }
        self.item = item
        setUpView(item: item)
        addTapGestureRecogniser()
    }
    
    func addTapGestureRecogniser() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
        self.addGestureRecognizer(tapGesture)
        self.isUserInteractionEnabled = true
    }
    
    @objc func tapGesture() {
        delegate?.navigate(cell: self)
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        titleLabel.text = ""
    }
}

extension NavigateCell {
    
    func setUpView(item: NavigateComponent) {
        
        titleLabel.text = item.title
        addSubview(titleLabel)
        NSLayoutConstraint.activate([
            titleLabel.topAnchor.constraint(equalTo: topAnchor),
            titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
            titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16),
            titleLabel.bottomAnchor.constraint(equalTo: bottomAnchor),
        ])
    }
} // END

UPDATED WEAK DELEGATE IN CELL

protocol NavigateCellDelegate: AnyObject {
    func navigate(cell: NavigateCell)
}

class NavigateCell: UICollectionViewCell {


weak var item: NavigateComponent?
weak var delegate: NavigateCellDelegate?
1

There are 1 best solutions below

0
On

Figured it out - The problem was with my DiffableDataSource and not declaring [weak self]

return UICollectionViewDiffableDataSource(collectionView: profileView.collectionView) { [weak self] collectionView, indexPath, item in