UIVIewController 弹出时未取消初始化

问题描述 投票:0回答:1

我正在一个应用程序中构建一个设置屏幕,其中有一个单元格列表。如果用户点击一个单元格,它将另一个控制器推入堆栈。但是,我的应用程序中的多个地方都有此流程。

因此,我决定重用通用控制器并用部分对其进行初始化(取决于点击的单元格)

但是,当弹出 UIViewController 时,它不会被取消初始化

查看控制器代码

// 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)
    }
}

手机号码

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

更新了单元中的弱委托

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

class NavigateCell: UICollectionViewCell {


weak var item: NavigateComponent?
weak var delegate: NavigateCellDelegate?
ios swift uiviewcontroller retain-cycle strong-reference-cycle
1个回答
1
投票

弄清楚了 - 问题出在我的 DiffableDataSource 上并且没有声明 [weak self]

return UICollectionViewDiffableDataSource(collectionView: profileView.collectionView) { [weak self] collectionView, indexPath, item in
© www.soinside.com 2019 - 2024. All rights reserved.