viewDidAppear называют стрэнгли

У меня есть 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)
}

Я просто не могу понять поведение. Поэтому, пожалуйста, направьте меня.


person Asim Ifitkhar Abbasi    schedule 08.05.2017    source источник
comment
Контроллер просмотра, содержащий сегментированный элемент управления и VCA, одинаков?   -  person Priyal    schedule 08.05.2017
comment
нет Они не одинаковы. viewController, содержащий segmentedControl, — это другой VC, назовем его VCSegmentedControl.   -  person Asim Ifitkhar Abbasi    schedule 08.05.2017
comment
Почему вы удаляете viewController и добавляете тот же viewController?   -  person Karthick Selvaraj    schedule 08.05.2017
comment
На самом деле я использую ту же функцию, когда пользователь нажимает на элемент управления сегментом. Поэтому я удаляю его, прежде чем добавлять снова, иначе я думаю, что он будет добавляться несколько раз.   -  person Asim Ifitkhar Abbasi    schedule 08.05.2017
comment
Попробуйте использовать представления контейнеров.   -  person Darshan Karekar    schedule 08.05.2017
comment
можете ли вы предложить какой-либо другой сценарий без изменения реализации   -  person Asim Ifitkhar Abbasi    schedule 08.05.2017


Ответы (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)
}
person DonMag    schedule 08.05.2017

Вот, вы можете добиться этого, используя 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()
    }

}

}

Спасибо.

person Karthick Selvaraj    schedule 09.05.2017
comment
Спасибо за ваше решение, но я не хочу менять свою реализацию... :) - person Asim Ifitkhar Abbasi; 09.05.2017