viewDidAppear называется strangley
У меня есть viewController
, содержащий segmentedControl
. У меня есть VCA и VCB, которые находятся в segmentedControl
. Когда я нажимаю на второй сегмент, появляется VCB. Теперь я толкаю другой ViewController от VCB. Но, возвращаясь от этого viewController, вызывается viewDidAppear
VCA. Что для меня странно. Поскольку пользователь находится на VCB, так почему вызываются viewWillAppear
и viewDidAppear
VCA ? Вот диаграмма, чтобы объяснить больше
Вот как я добавляю viewControllers в segmentedControl
func switchToViewController(viewController: UIViewController, selectedIndex: Int) {
viewController.removeFromParentViewController()
viewController.view.removeFromSuperview()
addChildViewController(viewController)
viewController.view.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(viewController.view)
// Setting constraints of the container view
NSLayoutConstraint.activate([
viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),
viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50),
viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0)
])
viewController.didMove(toParentViewController: self)
}
Я просто не в состоянии понять это поведение. Так что, пожалуйста, веди меня.2 ответа:
Вы никогда не удаляете ток контроллер вида и его вид из иерархии...
Вам нужно отслеживать, какой VC / view в данный момент отображается - возможно, с переменной
currentVC
, и ваша функция должна выглядеть примерно так:func switchToViewController(viewController: UIViewController, selectedIndex: Int) { // remove current ViewController from VC hierarchy currentVC.removeFromParentViewController() // remove current VC.View from View hierarchy currentVC.view.removeFromSuperview() // the "incoming" ViewController becomes the "current" ViewController currentVC = viewController addChildViewController(viewController) viewController.view.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(viewController.view) // Setting constraints of the container view NSLayoutConstraint.activate([ viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), viewController.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 50), viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0) ]) viewController.didMove(toParentViewController: self) }
Вот вы идете, вы можете достичь этого с помощью
containerView
.ContainerView
является нормальным подклассомUIView
. Ваш пользовательский интерфейс будет выглядеть так. У вас будет одинbaseViewController
, где вы будете иметьsegmentControl
иcontainerView
представление в baseViewController.Предположим, что у вас есть два контроллера вида, а именно
viewController1
иviewController2
. Вы можете добавить эти viewControllers какchildViewController
к этомуcontainerView
, как показано ниже.import UIKit class BaseViewController: UIViewController { @IBOutlet weak var typeSegment: UISegmentedControl! @IBOutlet weak var containerView: UIView! var viewController1: UIViewController? var viewController2: UIViewController? // MARK: - Action method. @IBAction func segmentIndexChanged(_ sender: Any) { let selectedIndex = typeSegment.selectedSegmentIndex switch selectedIndex { case 0: addVC1() case 1: addVC2() default: break } } func rectForChildVC() -> CGRect { let rect = CGRect(x: containerView.frame.origin.x , y: containerView.frame.origin.y, width: containerView.frame.size.width, height: containerView.frame.size.height) return rect } func addVC1() { removeVC2() let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil) viewController1 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller1Identifier") // Create you first view controller instance here. viewController1?.view.frame = rectForChildVC() addChildViewController(viewController1!) view.addSubview((viewController1?.view)!) viewController1?.didMove(toParentViewController: self) view.layoutIfNeeded() } func addVC2() { removeVC1() let storyboard = UIStoryboard(name: "StoryboardName", bundle: nil) viewController2 = storyboard.instantiateViewController(withIdentifier: "Viewcontroller2Identifier") // Create you second view controller instance here. viewController2?.view.frame = rectForChildVC() addChildViewController(viewController2!) view.addSubview((viewController2?.view)!) viewController2?.didMove(toParentViewController: self) view.layoutIfNeeded() } func removeVC1() { // Remove first view controller. if let viewController = viewController1 { viewController.didMove(toParentViewController: nil) viewController.view.removeFromSuperview() viewController.removeFromParentViewController() } } func removeVC2() { // Remove second view controller if let viewController = viewController2 { viewController.didMove(toParentViewController: nil) viewController.view.removeFromSuperview() viewController.removeFromParentViewController() } } }
Спасибо.