简体   繁体   English

UIVIewController 弹出时未取消初始化

[英]UIVIewController Not Getting Deinitialized When Popping

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.如果用户点击一个单元格,它会将另一个 controller 推到堆栈上。 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)因此,我决定重用一个通用的 controller 并用部分初始化它(取决于哪个单元被点击)

However, when popping a UIViewController it isn't getting deinitialized但是,当弹出 UIViewController 时,它不会被取消初始化

VIEW CONTROLLER CODE查看 CONTROLLER 代码

// 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?

Figured it out - The problem was with my DiffableDataSource and not declaring [weak self]想通了-问题出在我的 DiffableDataSource 上,而不是声明 [weak self]

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM