首页 > 解决方案 > 登录后我的 UI 视图搞砸了(ios swift 5)

问题描述

我创建了一个非常简单的登录页面,当它们匹配时,它将转到主页。但是当它进入主屏幕时有点混乱。图片如下:

登录页面 乱七八糟的主页

如果我将初始视图放在主屏幕视图中,它将按预期工作,如下所示:

主屏幕

这是我的简单登录代码:

@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")
    }
}

我在这里做错了吗?任何帮助将不胜感激谢谢

标签: iosswiftuitableviewauthenticationuiview

解决方案


您的代码中有一些问题,最重要的是您正在推送主视图控制器,同时还将其设置为根视图控制器。你不应该两者都做,这可能就是你的 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)
}

推荐阅读