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

时间:2017-07-15 12:06:56

标签: xcode view swift3 controller containers

我正在尝试以编程方式设置/或更改控制器视图中嵌入的视图控制器

我有3个不同的View Controllers,我想在Container View中显示,这取决于用户是否登录。

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

我尝试过的许多代码也没有在Swift 3中,所以作为一个新的应用程序开发人员,这非常紧张,因为我试图将其转换为Swift 3。

任何人都可以提供更改视图容器内嵌入式视图控制器的解决方案吗?感谢。

2 个答案:

答案 0 :(得分:14)

我可能已经为此找到了解决方案。我在这里回答,以防在我的情况下可以帮助其他任何人。

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

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

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/

答案 1 :(得分:2)

最简单的方法是在Storyboard中有3个容器视图,每个视图都连接到不同的视图控制器,然后在你的代码中,隐藏这3个容器视图中的2个并留下一个可见根据您的业务需求。

this blog post详细介绍了这一点。希望这有帮助!