Swift中如何检测带collectionView的ViewController是否首次被查看?
解决方案
你需要把原有的全局首次启动判断,替换为针对当前ViewController的独立判断,按需求选择持久化(全生命周期仅一次)或非持久化(每次启动首次进VC触发)方案即可:
方案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 }
- 新增私有属性记录当前VC是否为首次加载,避免viewWillAppear修改UserDefaults后viewDidAppear无法正确判断状态:
private var isFirstAppear = false
- 调整
viewWillAppear逻辑:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) isFirstAppear = isFirstTimeViewingCurrentVC() if isFirstAppear { self.startInstructions() self.coachMarksController.dataSource = self self.coachMarksController.delegate = self // 代理仅需设置一次,可移到此处 } }
- 调整
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
相关产品推荐
相关产品推荐

