ContainerView

  • 實作ContainerView的方法

    • 先在Storyboard上的ViewController拉一個Container View
    • 然後ViewController內宣告 @IBOutletweakvar containView: UIView! 並跟Container View做Binding
    • 然後宣告Container View內的ViewController
        // 用Lazy是有需要用到在初始化,此為第一個ViewController
        private lazy var infoViewController: StoreDetailInfoViewController = {
            let storyboard = UIStoryboard(name: "Main", bundle: .main)
            var viewController = storyboard.instantiateViewController(withIdentifier: "StoreDetailInfoViewController") as! StoreDetailInfoViewController
            viewController.store = self.store
            self.add(asChildViewController: viewController)
            return viewController
        } ()
    
        // 此為第二個ViewController
        private lazy var featuredViewController: StoreDetailFeaturedViewController = {
            let storyboard = UIStoryboard(name: "Main", bundle: .main)
            var viewController = storyboard.instantiateViewController(withIdentifier: "StoreDetailFeaturedViewController") as! StoreDetailFeaturedViewController
            viewController.store = self.store
            self.add(asChildViewController: viewController)
            return viewController
        } ()
    
    • 然後寫顯示和移除ViewController的函式
        // 顯示ViewController
        fileprivate func add(asChildViewController viewController: UIViewController) {
    
            // 新增viewController成原本viewcontroller的子viewcontroller
            self.addChildViewController(viewController)
    
            // 新增viewController的view 成 原本viewcontroller的view的subview
            self.containView.addSubview(viewController.view)
    
            // 設定 viewController的view的座標位置跟原本viewcontroller的containView的座標位置一致
            viewController.view.frame.origin = self.containView.bounds.origin
    
            // 設定 viewController的view的Frame跟原本viewcontroller的containView的大小一樣
            viewController.view.frame.size = self.containView.frame.size
    
            // 將子viewcontroller移到父viewcontroller的位置
            viewController.didMove(toParentViewController: self)
        }
    
        // 移除ViewController
        fileprivate func remove(asChildViewController viewController: UIViewController) {
    
            // 在調用removeFromParentViewController要先調用willMovetoParanetViewController
            // 
            viewController.willMove(toParentViewController: nil)
    
            // 將子viewController的view從父viewController的view移除
            viewController.view.removeFromSuperview()
    
            // 正式將子viewController從父viewController移除
            viewController.removeFromParentViewController()
        }
    
    • 在viewDidLoad就先新增要首先顯示的ViewController
        override func viewDidLoad() {
    
            super.viewDidLoad()        
            self.add(asChildViewController: infoViewController)
        }
    
    • 實作切換子viewcontroller的函式
        private func showViewController(type:ContainerViewController) {
    
            if type == .Feature {
                self.remove(asChildViewController: infoViewController)
                self.add(asChildViewController: featuredViewController)
            } else if type == .Store {
                self.remove(asChildViewController: featuredViewController)
                self.add(asChildViewController: infoViewController)
            }
        }
    

results matching ""

    No results matching ""