Ios 以编程方式将UIViewController加载到容器视图中

Ios 以编程方式将UIViewController加载到容器视图中,ios,swift,xcode,Ios,Swift,Xcode,这是最新的XCode 11.3。我已经看过了类似问题的答案,但是一些函数名和参数似乎已经改变了 在学习我的课程时,我试图制作一个简单的登录/注册界面。在我的第一个视图控制器中,我有一个包含标签、分段控件和容器视图的垂直堆栈视图。分段控件可以是“登录”或“注册”。我想在分段控件更改时加载适当的视图控制器 我的LogInViewController有一个垂直堆栈视图,其中一个文本字段表示用户名,另一个字段表示密码,还有一个登录按钮。My SignUpViewController有一个垂直堆栈视图,

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

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

我的LogInViewController有一个垂直堆栈视图,其中一个文本字段表示用户名,另一个字段表示密码,还有一个登录按钮。My 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评论中拼凑了这一点。非常感谢您的帮助。

请确保
@IBOutlet var customContainer:UIView链接到containerview,而不是脚本中vc的主视图

请确保此
@IBOutlet var customContainer:UIView链接到containerview,而不是脚本中vc的主视图

请尝试以下代码:)

PS:
@IBAction func controlChanged(uu发送方:Any)
是“ValueChanged”事件的iAction

}请尝试以下代码:)

PS:
@IBAction func controlChanged(uu发送方:Any)
是“ValueChanged”事件的iAction



}

什么是IBI中的
customContainer
链接对不起,我不明白这个问题,Shu Khan。主情节提要中的元素是一个容器视图(如果您是这样要求的话)。在情节提要中有一个箭头,它指向哪个vc?第一个是包含分段控件的默认箭头。请确保此
@IBOutlet var customContainer:UIView
链接到containerview而不是Storyboard中vc的主视图什么是IBI中的
customContainer
链接对不起,我不明白这个问题,Shu Khan。主情节提要中的元素是一个容器视图(如果您是这样要求的话)。在情节提要中有一个箭头,它指向哪个vc?第一个是包含分段控件的默认箭头。请确保此
@IBOutlet var customContainer:UIView
链接到containerview,而不是Storyboard中vc的主视图。另外,请确保“customContainer”指向正确的视图,因为我认为它链接到ViewControllery的主视图。您和Sh_Khan都很快发现了这一点。感谢您提供了改进的代码。上述代码将在用户单击时不断添加多个子视图,因此请检查变量是否为空。如果您指的是customContainer.addSubview调用@Sh_Khan?@Sh_Khan,此代码将在添加其他视图之前从superview中删除该视图,因此可以安全地重新添加它,这比同时添加这两个视图要好,并且要不断更改“isHidden”,还要确保“customContainer”指向正确的视图,因为我认为它链接到了ViewControlleryYou和Sh_Khan的主视图,他们都很快发现了这一点。感谢您提供了改进的代码。上述代码将在用户单击时不断添加多个子视图,因此请检查变量是否为空。如果您指的是customContainer.addSubview调用@Sh_Khan?@Sh_Khan,此代码将在添加其他视图之前从superview中删除该视图,因此可以安全地重新添加它,这总比同时添加这两个视图好,并且继续更改“ishedin”我的登录和注册视图现在显示正确,但是它们在模拟器中没有得到关注。我是否需要进行一些显式调用以使其可用?没有键盘显示的焦点是什么?将它们添加到
viewDidLoad
中,并在片段操作中为两个调用切换
ishiden
。当显示loginView`时,makeFirstResponder()
,我显然感到困惑。视图出现时,我无法在文本字段中输入文本,也无法通过单击模拟器中的按钮获得响应。在第一个文本字段上调用becomeFirstResponder()允许我在那里输入文本,但我不能单击其他字段,尽管我可以对它们进行制表。该按钮可见,但无法单击。我的登录和注册视图现在显示正确,但它们在模拟器中无法获得焦点。我是否需要进行一些显式调用以使其可用?没有键盘显示的焦点是什么?将它们添加到
viewDidLoad
中,并在片段操作中为两个调用切换
ishiden
。当显示loginView`时,makeFirstResponder()
,我显然感到困惑。视图出现时,我无法在文本字段中输入文本,也无法通过单击模拟器中的按钮获得响应。在第一个文本字段上调用becomeFirstResponder()允许我在那里输入文本,但我不能单击其他字段,尽管我可以对它们进行制表。按钮可见,但无法单击。
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()
}