ios - 以编程方式将 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 对旧版本的评论中将其拼凑在一起。任何帮助是极大的赞赏。
解决方案
试试下面的代码:)
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()
}
}
推荐阅读
- java - 检查两个 Java 日期是否相同 | 安卓
- sql - SQL查询查找客户第一次和第二次购买之间的平均天数?
- c# - 在 EF Core 5 中检测模型和数据库是否不同步
- apache-flink - 如何在 Flink 中为特定的键控状态配置 rockDB StateBackend 参数
- python - Pymoo -Error:值的数量和人口规模不匹配
- javascript - 隐藏页面时使 requestAnimationFrame 工作
- php - 使用 ftp_put() 在 php5.6-fpm 上的流网络问题
- f# - 如何在异步编程 (F#) 中解决 Visual Studio 2019 中的所有错误
- flutter - 在 Flutter 中使用 Getx 管理应用程序生命周期状态?
- c++ - 为什么 const_cast 不适用于 Eigen 的原始模板函数?