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

Swift中如何检测带collectionView的ViewController是否首次被查看?

解决方案

你需要把原有的全局首次启动判断,替换为针对当前ViewController的独立判断,按需求选择持久化(全生命周期仅一次)或非持久化(每次启动首次进VC触发)方案即可:


方案1:引导仅在应用全生命周期内触发一次(卸载重装才会再次显示)

  1. 新增针对当前VC的首次查看判断方法,使用独立的UserDefaults键存储状态,避免和全局启动状态冲突:
func isFirstTimeViewingCurrentVC() -> Bool {
    let defaults = UserDefaults.standard
    // 此处key请替换为项目内唯一的标识,不要和其他存储键重复
    let uniqueVCKey = "hasViewedTargetCollectionViewController"
    if !defaults.bool(forKey: uniqueVCKey) {
        defaults.set(true, forKey: uniqueVCKey)
        return true
    }
    return false
}
  1. 新增私有属性记录当前VC是否为首次加载,避免viewWillAppear修改UserDefaults后viewDidAppear无法正确判断状态:
private var isFirstAppear = false
  1. 调整viewWillAppear逻辑:
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    isFirstAppear = isFirstTimeViewingCurrentVC()
    if isFirstAppear {
        self.startInstructions()
        self.coachMarksController.dataSource = self
        self.coachMarksController.delegate = self // 代理仅需设置一次,可移到此处
    }
}
  1. 调整viewDidAppear逻辑:
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if isFirstAppear {
        self.coachMarksController.start(in: .window(over: self))
    }
}

方案2:每次应用冷启动后,第一次进入该VC都触发引导

不需要持久化到UserDefaults,直接使用静态变量存储当前启动周期内的访问状态即可,判断方法替换为:

// 静态变量存储当前启动周期内的访问状态
private static var hasViewedInCurrentLaunch = false

func isFirstTimeViewingCurrentVC() -> Bool {
    if !Self.hasViewedInCurrentLaunch {
        Self.hasViewedInCurrentLaunch = true
        return true
    }
    return false
}

其余属性配置、生命周期方法调用逻辑和方案1完全一致。


内容的提问来源于stack exchange,提问作者getc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:45:01