如何实现仅首次登录显示引导页?(Xcode 9、Swift 4及更早版本)
实现首次登录仅显示引导幻灯片的方案(Swift 4 / Xcode 9)
嘿,这个需求在App开发里真的太常见了!刚好我在Swift 4和Xcode 9的环境下做过类似的实现,给你一步步拆解👇
核心思路
我们需要一个持久化的标记来记录用户是否已经看过引导页,这里用UserDefaults就足够了(轻量、易操作,完全适配这个场景)。启动App时先检查这个标记:如果是首次登录(标记不存在或为false),就展示引导页;否则直接进入主界面。
1. 定义标记常量 & 存储已读状态
首先定义一个统一的键名(避免拼写错误),然后在用户看完引导页的最后一步时,把标记设为true并持久化:
// 全局定义(比如在AppDelegate或者单独的Constants文件里) let hasSeenOnboardingKey = "hasSeenOnboarding" // 在引导页的"进入App"按钮点击事件里调用 @IBAction func enterAppButtonTapped(_ sender: UIButton) { // 标记用户已看过引导页 UserDefaults.standard.set(true, forKey: hasSeenOnboardingKey) UserDefaults.standard.synchronize() // Swift 4中建议调用,确保数据立即写入 // 跳转到主界面(根据你的导航结构选择push或present) let mainVC = storyboard?.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController navigationController?.pushViewController(mainVC, animated: true) }
2. App启动时判断标记,跳转对应界面
我们在AppDelegate的didFinishLaunchingWithOptions方法里做判断,决定初始显示哪个控制器:
代码控制窗口的方式(适合纯代码开发)
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 检查标记:默认返回false(如果从未设置过) let hasSeenOnboarding = UserDefaults.standard.bool(forKey: hasSeenOnboardingKey) // 初始化窗口 let window = UIWindow(frame: UIScreen.main.bounds) self.window = window // 根据标记选择初始控制器 if hasSeenOnboarding { // 主界面控制器 let mainVC = MainViewController() window.rootViewController = UINavigationController(rootViewController: mainVC) } else { // 引导页控制器 let onboardingVC = OnboardingViewController() window.rootViewController = onboardingVC } window.makeKeyAndVisible() return true }
Storyboard适配方式(适合用Storyboard开发的场景)
先给Storyboard里的引导页和主界面控制器设置好Storyboard ID(比如OnboardingVC和MainVC),然后:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let hasSeenOnboarding = UserDefaults.standard.bool(forKey: hasSeenOnboardingKey) let mainStoryboard = UIStoryboard(name: "Main", bundle: nil) let initialViewController: UIViewController if hasSeenOnboarding { initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "MainVC") } else { initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "OnboardingVC") } window?.rootViewController = initialViewController return true }
测试小技巧
如果需要重复测试引导页,可以:
- 直接删除模拟器里的App(清空UserDefaults数据)
- 临时把
hasSeenOnboarding的判断改成false,测试完再改回来 - 在Xcode的调试面板里修改UserDefaults的值(Debug -> Debug Workflow -> View Debugging -> View User Defaults)
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

