ios UIkit ChildController保留周期

o75abkj4  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(135)

嗨,我正在制作一个应用程序,我使用像苹果设置应用程序的tableView。我在不同的控制器中使用这个tableview,所以我创建了一个控制器,它作为子控件添加到需要使用这个tableview的控制器中。
它是子控制器的原因是因为它需要在多个控制器中重复使用表的布局和功能。
我遇到的问题是添加子控制器会使控制器保留在内存中。
以下是如何在主控制器消失之前删除子项:

guard parent != nil else { return }
        
        willMove(toParent: nil)
        removeFromParent()
        view.removeFromSuperview()

这是我如何将子对象添加到主控制器的方法:

addChild(controller)
    controller.view.frame = self.view.frame
    view.addSubview(controller.view)
    controller.didMove(toParent: self)

子控制器:

class ChildController: UIViewController {
    
    //MARK: - Propeties
    public var sections: [FormSection_Model] = [] {
        didSet {
            tableView.reloadData()
        }
    }
    
    public private(set) lazy var tableView: UITableView = {
        return UITableView(frame: .zero, style: style)
    }()
    
    override func setUp() {
        super.setUp()
        
        hideKeyboardWhenTappedAround()
        
        tableView.dataSource = self
        tableView.delegate = self
        
        tableView.register(ButtonForm_Cell.self)
        tableView.register(SwitchForm_Cell.self)
        tableView.register(TextFieldForm_Cell.self)
        tableView.register(TextViewForm_Cell.self)
        tableView.register(PickerForm_Cell.self)
        tableView.register(MultiPickerForm_Cell.self)
        tableView.register(LinkForm_Cell.self)
        tableView.contentInsetAdjustmentBehavior = .never
    }
    
    override func setUpLayout() {
        super.setUpLayout()
        
        view.addSubview(tableView)
        tableView.frame = view.frame
        tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 150, right: 0)
    }
}

extension ChilsController: UITableViewDelegate, UITableViewDataSource {
    //TableView delegate funcs...
}

主控制器:

class Controller: UIViewController {
    
    public private(set) lazy var formController: ChildController = {
        let controller = FormTableView_Controller(style: .insetGrouped)
        return controller
    }()
    
    override func setUp() {
        super.setUp()
        
        addChildController(formController)
    }
    
    override func cleanContent() {
        super.cleanContent()
        
        formController.removeFromParentViewController()
    }
    
    private func setSections() {
        formController.sections.append([
        //add items to child controller
        ])
    }
}
23c0lvtd

23c0lvtd1#

问题来了:

public private(set) lazy var formController: ChildController = {
    let controller = FormTableView_Controller(style: .insetGrouped)
    return controller
}()

删掉父级和子级都不能存储对对方的引用。如果它们需要相互交谈,则子视图控制器必须只谈论父视图控制器,父视图控制器必须只谈论其子视图控制器,使用UIViewController类中已经提供的parentchildren引用。

相关问题