У меня есть viewcontroller A, где я добавляю представления динамического контроллера других viewcontrollers в subView A. По соображениям эффективности я храню эти viewcontrollers в словаре и динамически удаляю / добавляю их представления.
Однако A деинициализируется, но не другие контроллеры представления. Я также вижу это в отладчике памяти, но не знаю, как решить этот цикл.
Вот мой словарь внутри A, который содержит все контроллеры подпредставления:
private var subControllerMap = [String:UIViewController?]()
А вот как я делаю эту динамическую загрузку
func addControllerWithIdentifierAndZoneId(_ identifier: String, storyboardNibName: String, containerView: UIView,zoneId: String?){
containerView.subviews.first?.removeFromSuperview()
let _ = children.map{$0.removeFromParent()}
var ctrlr: UIViewController? = subControllerMap[identifier] as? UIViewController
//only create a new controller if needed - otherwise use reference from map
if ctrlr == nil{
let storyboard = UIStoryboard(name: storyboardNibName, bundle: nil)
ctrlr = storyboard.instantiateViewController(withIdentifier: identifier)
subControllerMap[identifier] = ctrlr
}
guard let controller = ctrlr else{
return
}
if let castedController = controller as? BController {
castedController.isInEditMode = true
}else if let castedControler = controller as? CController{
castedControler.isInEditMode = false
}else if let castedController = controller as? DController{
castedController.isInEditMode = true
}
controller.view.translatesAutoresizingMaskIntoConstraints = false
addChild(controller)
addSubview(subView: controller.view, toView: containerView)
controller.didMove(toParent: self)
}
Эта функция вызывается, если я нажимаю сегмент на сегментированном элементе управления. Э.Г.
addControllerWithIdentifierAndZoneId("BController", storyboardNibName: "Room", containerView: containerView,zoneId: zoneId)
Я пытался убрать в vieDidDisappear, но это не помогло
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
subControllerMap.values.forEach { (controller) in
controller?.view.removeFromSuperview()
controller?.removeFromParent()
}
subControllerMap.removeAll()
containerView.subviews.forEach { (view) in
view.removeFromSuperview()
}
containerView.removeFromSuperview()
}