【问题标题】:Keep contents of a container view in Navigation Stack在导航堆栈中保留容器视图的内容
【发布时间】:2023-03-25 03:13:01
【问题描述】:

我有一个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 导航堆栈中?我怀疑它与我的 HomeViewContainer 类中的 add() 方法有关,但我不知道采取什么合适的解决方案。

【问题讨论】:

    标签: swift uicollectionview uinavigationcontroller


    【解决方案1】:

    找到了解决办法。我需要将 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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2018-04-02
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多