Контейнер Просмотр внутренней панели утечки памяти контроллера - PullRequest
0 голосов
/ 02 июля 2019

В моем приложении у меня есть UITabBarController, внутри которого я поместил UIContainerView, чтобы отобразить множество различных страниц внутри него.

По умолчанию, Экран 1 загружается внутри этого контейнера с самого начала, используя раскадровки,Вот код того, как я добавляю UIViewControllers к представлению контейнера и удаляю, когда добавляется новый:

@objc func switchContainerViewContent() {

    switch viewControllerId {
    case "1":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "MedicalInsurancePolicyScreen") as? MedicalInsuranceScreenViewController else {
            return
        }

        self.add(childVC, frame: self.containerView.frame)
    case "2":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "HouseInsurancePolicyScreen") as? HouseInsuranceScreenViewController else {
            return
        }

        self.add(childVC, frame: self.containerView.frame)
    case "3":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "CarInsurancePolicyScreen") as? CarInsuranceScreenViewController else {
            return
        }

        self.add(childVC, frame: self.containerView.frame)
    default:
        break
    }
}

@objc func removePreviousChildViewContent() {

    switch viewControllerId {
    case "1":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "MedicalInsurancePolicyScreen") as? MedicalInsuranceScreenViewController else {
            return
        }

        childVC.remove()
    case "2":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "HouseInsurancePolicyScreen") as? HouseInsuranceScreenViewController else {
            return
        }

        childVC.remove()
    case "3":

        guard let childVC = self.storyboard?.instantiateViewController(withIdentifier: "CarInsurancePolicyScreen") as? CarInsuranceScreenViewController else {
            return
        }

        childVC.remove()
    default:
        break
    }
}

Вот добавляем и удаляем сам func:

func add(_ child: UIViewController, frame: CGRect? = nil) {

    addChildViewController(child)
    if let frame = frame {
        child.view.frame = frame
    }
    view.addSubview(child.view)
    child.didMove(toParentViewController: self)
}

func remove() {

    willMove(toParentViewController: nil)
    view.removeFromSuperview()
    removeFromParentViewController()
}

И этопредставление коллекции, которое обрабатывает переключение содержимого внутри контейнера:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    selectedPolicyIndex = indexPath

    guard let cell = collectionView.cellForItem(at: selectedPolicyIndex) as? PoliciesCell else { return }

    cell.selectionView.isHidden = false
    cell.policyNumber.isHidden = true
    cell.policyName.isHidden = true

    collectionView.reloadData()
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "removePreviousPolicy"), object: nil)

    switch indexPath.item {
    case 0:
        viewControllerId = "1"
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "switchPolicies"), object: nil)
    case 1:
        viewControllerId = "2"
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "switchPolicies"), object: nil)
    case 2:
        viewControllerId = "3"
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "switchPolicies"), object: nil)
    default:
        break
    }
}

Ошибка появляется при переключении с одной вкладки на другую в TabBar.По какой-то причине мой контейнер запоминает все экраны, которые были представлены внутри этого контейнера, и загружает их один за другим, когда я снова открываю эту вкладку

Чтобы быть более точным, вот что происходит:

  • Пользователь входит на вкладку с контейнером и переключается между различными экранами, открывает экран 1, 3, 2 и 1.
  • После этого он переходит на другую вкладку, а после возвращается наэта вкладка по какой-то причине в представлении контейнера начинает загружаться 1, 3, 2 и 1 экраны, которые он открыл ранее.

Все это вызывает увеличение использования памяти, когда эти действия выполняются 10-15 раз.

Что я делаю не так?

...