Хранить содержимое представления контейнера в стеке навигации - PullRequest
0 голосов
/ 25 августа 2018

У меня есть HomeViewcontroller, где у меня есть сегментированный контроллер, который переключается между тремя UICollectionViews в контейнере.

HomeViewContainer является корнем моего контроллера навигации

class HomeViewContainer: UIViewController {

    let displayOptionSegmentedControl: UISegmentedControl = {
        let segmentedControl = UISegmentedControl(items: ["Businesses","List","Map"])
        segmentedControl.setupBasicControllerColors()
        return segmentedControl
    }()

    let businessCollectionViewController = BusinessCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())
    let couponCollectionViewController = CouponCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())

    var currentSegmentIndex = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.mainWhite()

        setupHeaderView()
        add(asChildViewController: businessCollectionViewController)

    }


    fileprivate func add(asChildViewController viewController: UIViewController) {
        contentContainer.addChildViewController(viewController)
        contentContainer.view.addSubview(viewController.view)
        viewController.view.frame = view.bounds
        viewController.didMove(toParentViewController: self)
    }

    fileprivate func remove(asChildViewController viewController: UIViewController) {

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

    @objc func segmentedValueChanged(_ sender: UISegmentedControl) {

        if currentSegmentIndex != sender.selectedSegmentIndex {
            switch currentSegmentIndex {
            case 0:
                remove(asChildViewController: businessCollectionViewController)
            case 1, 2:
                remove(asChildViewController: couponCollectionViewController)
            default:
                break
            }

            //Add new view based on user chosen option.
            switch sender.selectedSegmentIndex {
            case 0:
                currentSegmentIndex = sender.selectedSegmentIndex
                add(asChildViewController: businessCollectionViewController)
            case 1:
                currentSegmentIndex = sender.selectedSegmentIndex
                couponCollectionViewController.toggleMapHeaderOff()
                add(asChildViewController: couponCollectionViewController)
            case 2:
                currentSegmentIndex = sender.selectedSegmentIndex
                couponCollectionViewController.toggleMapheaderOn()
                add(asChildViewController: couponCollectionViewController)
            default:
                break
            }
        }
    }
}

Представления отображаются правильно, но проблема возникает, когда я щелкаю ячейку в одном из представлений моей коллекции.

Например, если я щелкаю по ячейке в моем businessCollectionViewController, я пытаюсь представить другой ViewController в моем навигационном контроллере и не могу.

BusinessCollectionViewController

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

        let bdvc = BusinessDetailViewController(collectionViewLayout: UICollectionViewFlowLayout())

        //NOTHING HAPPENS HERE
        self.navigationController?.present(bdvc, animated: false, completion: nil)
    }

Как сделать так, чтобы содержимое ContentContainer оставалось в пределах стека навигации HomeViewContainer ?Я подозреваю, что это как-то связано с методом add () в моем классе HomeViewContainer , но я не знаю, какое подходящее решение выбрать.

1 Ответ

0 голосов
/ 25 августа 2018

Нашел решение. Мне нужно было добавить ContentContainer как ребенка в мой HomeViewContainer.

В HomeViewContainer

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = UIColor.mainWhite()

    //Added this line!
    addChildVC(vc: contentContainer, toView: self.view)

    setupHeaderView()
    add(asChildViewController: businessCollectionViewController)

}

//And added this helper method
public func addChildVC(vc: UIViewController, toView containerView: UIView) {
    addChildViewController(vc)
    let frame = CGRect(x: 0, y: 0, width: containerView.frame.width, height: containerView.frame.height)
    print("Container Frame = \(containerView.frame)")
    vc.view.frame = frame
    containerView.addSubview(vc.view)
    vc.didMove(toParentViewController: self)
}
...