Swift中如何让SplashViewController的GreetingLabel按启动次数显示不同内容?
实现iOS启动页首次/后续启动显示不同问候语的方案
直接把UserDefaults的判断逻辑移到SplashViewController里即可,这样能直接操作greetingLabel,具体修改步骤如下:
1. 简化SceneDelegate代码
把原来SceneDelegate里的判断逻辑删掉,只保留基础的窗口初始化代码:
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let _ = (scene as? UIWindowScene) else { return } } }
2. 修改SplashViewController处理逻辑
在viewDidLoad方法里添加UserDefaults判断,根据是否首次启动设置Label文本,同时标记首次启动状态:
class SplashViewController: UIViewController { @IBOutlet weak var greetingLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // 判断是否是首次启动 let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore") if launchedBefore { greetingLabel.text = "Hello" } else { greetingLabel.text = "Welcome!" // 标记为已启动过 UserDefaults.standard.set(true, forKey: "launchedBefore") // 立即同步(可选,确保下次启动能读取到) UserDefaults.standard.synchronize() } DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { self.performSegue(withIdentifier: "splashToMain", sender: nil) } } }
补充说明
把UI相关的逻辑放在视图控制器里更合理,符合iOS开发的MVC职责划分——视图控制器负责自己的UI展示和数据绑定,避免在SceneDelegate这类生命周期代理中直接操作UI控件。
内容的提问来源于stack exchange,提问作者LordGrim
相关产品推荐
相关产品推荐

