我创建了一个非常简单的登录页面,当它们匹配时,它会进入主页.但它进入主屏幕时有点混乱,图片如下:
如果我把初始视图放在主屏幕视图中,它就会像这样工作。
这是我简单的登录代码。
@IBAction func LoginTapped(_ sender: Any) {
let id = idTxtfield.text!.trimmingCharacters(in: .whitespacesAndNewlines)
let password = passwordTxtfield.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if id == "ID" && password == "Password" {
let HomeScreenVC = self.storyboard?.instantiateViewController(identifier: "HomeScreenVC") as! HomeScreenVC
self.navigationController?.pushViewController(HomeScreenVC, animated: true)
// make it as root view
self.view.window?.rootViewController = HomeScreenVC
self.view.window?.makeKeyAndVisible()
}
else {
print("wrong password")
}
}
我在这里做错了什么吗?任何帮助将被感激Thanks
你的代码有几个问题,最重要的是你在推送主视图控制器的同时,还把它设置为根视图控制器。你不应该两者兼而有之,这可能是你的UI看起来一团糟的原因。
如果你想简单地在屏幕上推送它,只需使用。
navigationController?.pushViewController(homeViewController, animated: true)
但如果你想完全改变根视图控制器,那么你需要访问你的应用程序窗口,并设置新的根视图控制器(有或没有动画)。假设你的应用中只有一个窗口,你可以这样访问它。
UIApplication.shared.windows.first(where: { $0.isKeyWindow })
另外,使用小写字母来命名你的属性或方法是一个很好的做法,而使用大写字母来命名你的结构、枚举或类。
最后,你的 didTapLogin()
方法将成为。
@IBAction func didTapLogin() {
guard let username = usernameTextField.text, let password = passwordTextField.text, username == "some_username", password == "some_password" else {
// Wrong password
return
}
guard let mainWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
let homeViewController = storyboard!.instantiateViewController(identifier: "HomeScreenVC") as! HomeScreenVC
mainWindow.rootViewController = homeViewController
UIView.transition(with: mainWindow, duration: 1.0, options: .transitionCrossDissolve, animations: nil, completion: nil)
}