В моем приложении у меня есть 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 раз.
Что я делаю не так?