iOS开发:如何实现ViewController切换及登录权限页面访问控制?
解决方案:完成ViewController切换与登录状态控制
看起来你已经迈出了第一步——成功实现了从LogVC到UserDetailVC的页面跳转!接下来咱们把登录状态控制和页面权限的逻辑补全,让整个流程更严谨。
1. 先搞定登录状态的持久化
要实现“未登录不能进详情页、已登录不能回登录页”,首先得把用户的登录状态存起来,这里用UserDefaults就足够应付简单场景:
// 登录成功后(比如用户输入完账号密码验证通过时)保存登录状态 UserDefaults.standard.set(true, forKey: "isUserLoggedIn") // 后续需要检查状态时读取 let isLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn")
2. 给两个页面加上访问权限校验
给UserDetailVC加“未登录拦截”
在UserDetailVC的viewWillAppear方法里检查登录状态,如果用户没登录,直接退回到登录页:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let isLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") if !isLoggedIn { // 如果你用的是present方式跳转,就用dismiss返回 self.dismiss(animated: true, completion: nil) // 要是用导航控制器push的话,就换成这个: // self.navigationController?.popToRootViewController(animated: true) } }
给LogVC加“已登录拦截”
同样在LogVC的viewWillAppear里检查,如果用户已经登录,直接跳转到详情页,不让用户停留在登录页:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let isLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") if isLoggedIn { let userController = self.storyboard?.instantiateViewController(withIdentifier: "userDetailVC") as! UserDetailVC self.present(userController, animated: false, completion: nil) } }
⚠️ 小提醒:Swift类名要遵循大驼峰规范,记得把你的userDetailVC改成UserDetailVC,不然容易出现运行时找不到控制器的错误,Storyboard里的控制器ID也要对应上哦。
3. 实现退出登录功能
在UserDetailVC里加个退出按钮,点击后清除登录状态并返回登录页:
@IBAction func logoutButtonTapped(_ sender: UIButton) { // 清除登录状态 UserDefaults.standard.set(false, forKey: "isUserLoggedIn") // 返回登录页 self.dismiss(animated: true, completion: nil) }
可选优化:用导航控制器管理页面
如果你的页面需要导航栏(比如显示返回按钮、标题),建议把LogVC嵌入到UINavigationController里,然后用push方式跳转,体验会更流畅:
// 登录成功时的跳转代码改成这样 if let userController = self.storyboard?.instantiateViewController(withIdentifier: "userDetailVC") as? UserDetailVC { self.navigationController?.pushViewController(userController, animated: true) } // 退出时的代码改成这样 self.navigationController?.popToRootViewController(animated: true)
要是你以后有更复杂的登录逻辑(比如和服务器交互、存储用户Token),可以把登录状态管理封装成一个单例类,比直接用UserDefaults更安全、更易维护~
内容的提问来源于stack exchange,提问作者Bogdan59
相关产品推荐
相关产品推荐

