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