首页 > 解决方案 > 以编程方式将 UIViewController 加载到容器视图中

问题描述

这是在最新的 XCode 11.3 中。我查看了类似问题的答案,但一些函数名称和参数似乎已经改变。

在学习 Udemy 课程时,我正在尝试制作一个简单的登录/注册界面。在我的第一个视图控制器中,我有一个包含标签、分段控件和容器视图的垂直堆栈视图。分段控件可以是“登录”或“注册”。我想在分段控件更改时加载适当的视图控制器。

顶级视图控制器

我的 LogInViewController 有一个垂直堆栈视图,其中包含一个用于用户名的文本字段、另一个用于密码的文本字段和一个登录按钮。我的 SignUpViewController 有一个垂直堆栈视图,其中包含用于电子邮件地址、用户名、密码和密码确认的文本字段,然后是一个注册按钮。

我的第一个视图控制器如下所示:

class ViewController: UIViewController
{
    @IBOutlet weak var logInSignUpControl: UISegmentedControl!
    @IBOutlet var customContainer: UIView!

    var logInVC: LogInViewController?
    var signUpVC: SignUpViewController?
    var activeVC = 0

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        initializeCustomControllers()
    }

    func initializeCustomControllers()
    {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        logInVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? LogInViewController
        signUpVC = storyboard.instantiateViewController(withIdentifier: "SignUpViewController") as? SignUpViewController

        logInVC?.willMove(toParent: self)
        logInVC?.view.frame = customContainer.bounds
        customContainer.addSubview(logInVC!.view)
        addChild(logInVC!)
        logInVC?.didMove(toParent: self)
    }

不幸的是,这仅显示 LogInViewController,而不是标签或分段控件。

它看起来如何

我无法在最新版本的 XCode 和 Swift 中找到有关如何执行此操作的清晰描述,因此我从各种博客文章和 Stackoverflow 对旧版本的评论中将其拼凑在一起。任何帮助是极大的赞赏。

标签: iosswiftxcode

解决方案


试试下面的代码:)

PS:@IBAction func controlChanged(_ sender: Any)是“ValueChanged”事件的 IBAction

class ViewController: UIViewController {

@IBOutlet weak var logInSignUpControl: UISegmentedControl!
@IBOutlet var customContainer: UIView!

var logInVC: LogInViewController?
var signUpVC: SignUpViewController?
var activeVC = 0

override func viewDidLoad()
{
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    initializeCustomControllers()
}

@IBAction func controlChanged(_ sender: Any) {
    changeVC()
}

func changeVC() {
    if activeVC == 0 {
        signUpVC?.view.removeFromSuperview()
        logInVC?.willMove(toParent: self)
        logInVC?.view.frame = customContainer.bounds
        customContainer.addSubview(logInVC!.view)
        addChild(logInVC!)
        logInVC?.didMove(toParent: self)
    } else {
        logInVC?.view.removeFromSuperview()
        signUpVC?.willMove(toParent: self)
        signUpVC?.view.frame = customContainer.bounds
        customContainer.addSubview(signUpVC!.view)
        addChild(signUpVC!)
        signUpVC?.didMove(toParent: self)
    }
    activeVC = activeVC == 0 ? 1 : 0
}

func initializeCustomControllers()
{
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    logInVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? LogInViewController
    signUpVC = storyboard.instantiateViewController(withIdentifier: "SignUpViewController") as? SignUpViewController
    changeVC()
}

}


推荐阅读