【问题标题】:Switch Between Child View Controllers在子视图控制器之间切换
【发布时间】:2019-04-10 02:54:49
【问题描述】:

我有一个包含多个容器视图的视图控制器,我们称之为 HomeViewController。我这样声明这些容器视图(childViewControllers)(每个都是一个容器视图,具有自己的嵌入式视图控制器:

private lazy var startContactViewController: StartContactViewController = {
    //Load Storyboard
    let storybaord = UIStoryboard(name: "Main", bundle: Bundle.main)

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

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

    return viewController
}()

private lazy var stopContactViewController: StopContactViewController = {
    //Load Storyboard
    let storybaord = UIStoryboard(name: "Main", bundle: Bundle.main)

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

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

    return viewController
}()

private lazy var startDayViewController: StartDayViewController = {
    //Load Storyboard
    let storybaord = UIStoryboard(name: "Main", bundle: Bundle.main)

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

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

    return viewController
}()

private lazy var loadingViewController: LoadingViewController = {
    //Load Storyboard
    let storybaord = UIStoryboard(name: "Main", bundle: Bundle.main)

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

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

    return viewController
}()

然后我有这两个函数来添加和删除 childViewControllers:

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)
}

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()
}

当我的应用首次加载时,会显示 StartDayViewController。在这个视图控制器中,它们是一个按钮。当用户按下该按钮时,我希望删除 StartDayViewController 并显示 StartContactViewController。如何从 StartDayViewController 实现这一点?

我还附上了故事板的图片。 Storyboard image

【问题讨论】:

    标签: ios swift uiviewcontroller xcode-storyboard uicontainerview


    【解决方案1】:

    你可以使用协议来做到这一点

    protocol StartVcProtocol {
             func startButtonPressed()
    }
    

    让 HomeViewController 实现它

    extension HomeViewController: StartVcProtocol {
        func startButtonPressed() {
            // start button pressed -- do your remove and add stuff here
        }
    }
    

    现在在 StartVc 中

    class StartVc: UIViewController {
    
        var delegate: StartVcProtocol?
    
    
     //inside you start button iBaction
    delegate?.startButtonPressed()
    
    }
    

    然后在懒惰的时候初始化StartVc

    viewController.delegate = self
    

    希望你得到所有的碎片。

    【讨论】:

    • 这很完美!只是为了澄清以防其他人正在寻找并确保我做得正确。我添加了协议、扩展名和“var delegate: StartVCProtocol?”到 StartDayViewController。然后我将“delegate?.startButtonPressed()”添加到 IBAction 然后在初始化 StartDayViewController 的 HomeViewController 中添加了“viewController.delegate = self”我可能没有在正确的文件中放置一些东西但是,这对我有用。
    • 随意编辑答案本身,不要将长代码作为注释。
    • 会的。我在文件中的解释和位置是否正确?
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多