Xcode - 我如何以编程方式在容器视图中嵌入/更改视图控制器?

Posted

技术标签:

【中文标题】Xcode - 我如何以编程方式在容器视图中嵌入/更改视图控制器?【英文标题】:Xcode - How can i programmatically embed/change view controller within a container view? 【发布时间】:2017-07-15 12:06:55 【问题描述】:

我正在尝试以编程方式设置/或更改 Controller View 内的嵌入式 View Controller

我有 3 个不同的视图控制器,我想在容器视图中显示它们,这一切都取决于用户是否登录。

我环顾四周并尝试了一堆代码,我找到了一个有效的,但代码改变了自身视图,而不是视图容器视图。

我尝试过的很多代码也没有在 Swift 3 中使用,所以作为一个新的应用程序开发人员,当我尝试将其转换为 Swift 3 时,压力很大。

谁能提供一个解决方案来更改视图容器内的嵌入式视图控制器?谢谢。

【问题讨论】:

在这里用最新的代码进行了全面解释:***.com/a/23403979/294884 【参考方案1】:

我可能已经找到了解决方案。我在这里回答,以防它可以帮助我的情况。

我所做的是添加一个新的 View Controller,然后将其嵌入到 View Container - 这将用作“主视图” - 然后我使用这个空白视图控制器来决定应该在空白的自我内更改哪个其他视图控制器。

这是我在空白视图控制器中的一些代码,但我想空白视图控制器也可以用作主视图控制器(在我的情况下为“帐户”),然后它可以添加登录/注册视图小时候。

override func viewDidLoad() 
    super.viewDidLoad()

    updateView()


private lazy var loginViewController: loginViewController = 
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as! loginViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
()

private lazy var registerViewController: registerViewController = 
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "registerViewController") as! registerViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
()

private func add(asChildViewController viewController: UIViewController) 
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)


private func remove(asChildViewController viewController: UIViewController) 
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()


private func updateView() 

    add(asChildViewController: registerViewController)

    /*
     if segmentedControl.selectedSegmentIndex == 0 
     remove(asChildViewController: sessionsViewController)
     add(asChildViewController: summaryViewController)
      else 
     remove(asChildViewController: summaryViewController)
     add(asChildViewController: sessionsViewController)
     
     */

感谢这个人:https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

【讨论】:

出色,易于实施,不会使设备过载并且在不同设备上都能正常工作! 正是我想要的,效果很好!来自 android 开发,这相当于在框架内交换片段。太棒了!【参考方案2】:

最简单的方法是让 Storyboard 中的 3 个容器视图相互叠加,每个视图都连接到不同的视图控制器,然后在您的代码中,将这 3 个容器视图中的 2 个隐藏起来,让一个可见根据您的业务需求。

这在this blog post中有详细描述。希望这会有所帮助!

【讨论】:

这个简单多了 在我看来这不是正确的方法,因为所有三个视图控制器都会并排存在,而不仅仅是在您真正需要它们的时候。

以上是关于Xcode - 我如何以编程方式在容器视图中嵌入/更改视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式嵌入 UIViewController?

如何以编程方式在滚动视图中嵌入堆栈视图

我应该在新视图中嵌入视图控制器的视图吗?

如何在视图控制器中以编程方式切换视图? (Xcode,iPhone)

如何以编程方式将视图控制器嵌入到导航视图控制器中

xcode/ios:以编程方式启动模态视图控制器时如何传递数据