在另一个视图控制器中添加视图控制器作为子视图

Posted

技术标签:

【中文标题】在另一个视图控制器中添加视图控制器作为子视图【英文标题】:Add a view controller as a subview in another view controller 【发布时间】:2018-09-13 08:44:36 【问题描述】:

我已经读过这个 LINK ,但不适合我。我想在另一个viewController 中将viewController 显示为子视图。

这是我的代码 -

import UIKit
import CarbonKit

class ViewController: UIViewController, CarbonTabSwipeNavigationDelegate 

 @IBOutlet weak var containerView: UIView!

 override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let items = ["All",  "WOMEN",  "MEN",  "KIDS",  "HOME",  "CITY"]
        let carbonTabSwipeNavigation = CarbonTabSwipeNavigation(items: items, delegate: self)
        carbonTabSwipeNavigation.insert(intoRootViewController: self)
    

    func carbonTabSwipeNavigation(_ carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAt index: UInt) -> UIViewController 

        //           let screen = self.storyboard?.instantiateViewController(withIdentifier: "demo") as! demo
        //           showSubViewContrller(subViewController: vc)
        //           return screen

        let storyBoard = getStoryBoardByIndentifier(identifier: "All")
        let vc = storyBoard.instantiateViewController(withIdentifier: "AllViewController") as! AllViewController
        showSubViewContrller(subViewController: vc)
        return vc
    

    //Subview Controller
    func showSubViewContrller(subViewController:UIViewController) 
        self.addChildViewController(subViewController)
        subViewController.view.frame = containerView.frame
        self.containerView.addSubview(subViewController.view)
        subViewController.didMove(toParentViewController: self)
    

    func getStoryBoardByIndentifier(identifier:String)->UIStoryboard 
        return  UIStoryboard.init(name: identifier, bundle: nil)
    


我有一个NavigationBar 和一个tapBar。想在 container 的视图中显示 viewController

但是当视图加载时它会覆盖/隐藏 tabBar。

如何解决这个问题并在我指定的容器中显示viewController。 项目链接-GitHub

【问题讨论】:

【参考方案1】:

不知何故,我能够通过以下更改解决您的问题:

viewDidLoad中的carbonTabSwipeNavigation.insert(intoRootViewController: self, andTargetView: containerView)替换这个方法carbonTabSwipeNavigation.insert(intoRootViewController: self)

注意:将UITaBar 底部约束赋予 SuperView 而不是 SafeArea:

在 ViewController 中添加以下代码:

override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()

        tabbar.invalidateIntrinsicContentSize()
    

执行此操作后,您将在运行时UITabBar

【讨论】:

@MdRashedPervez 为您工作? 非常感谢您的帮助。这个对我有用 :) 。但是另一个问题出现了——当 tabBar 视图出现在容器上时,段标题就消失了。你能帮我解决这个问题吗? :) 我已经检查过 Tabbar 没有引起问题。看起来carbonTabSwipeNavigation.insert(intoRootViewController: self, andTargetView: containerView)有问题

以上是关于在另一个视图控制器中添加视图控制器作为子视图的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewController 作为小视图中的子视图控制器 - 键盘问题

从父视图控制器再次推送时,子视图框架发生变化

添加全屏视图作为视图控制器的子视图

在 ios 中添加视图控制器作为子视图

我应该将底部工作表作为子视图添加到当前视图控制器还是推送添加了子视图的 UIWindow?

添加根视图控制器 OCMockObject[UIViewController] 作为子视图控制器错误