You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现仅首次登录显示引导页?(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:55:43