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

删除SceneDelegate是否正确?SwiftUI无Storyboard项目如何设置根视图?

嘿,我来帮你理清这两个问题:

关于SceneDelegate的必要性

对于你的情况——只支持iPhone、使用SwiftUI且无Storyboard,确实不需要SceneDelegate相关内容。SceneDelegate是iOS 13引入的组件,核心作用是支持多场景功能(比如iPad的多窗口显示、App切换时的场景生命周期管理)。如果你的项目只针对单场景的iPhone设备,完全可以放心移除它,保留AppDelegate的传统窗口管理方式完全能满足需求。

实现登录状态驱动的视图切换

你现在的AppDelegate结构完全可以直接实现根据登录状态展示不同视图的需求,具体步骤如下:

  1. 在application(_:didFinishLaunchingWithOptions:)方法中,先获取并处理登录状态:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 从Keychain获取登录状态,处理可选值,默认设为未登录
        let isLoggedIn = TegKeychain.get("ISLOGGEDIN") as? Bool ?? false
        
        // 初始化window并设置根视图
        window = UIWindow(frame: UIScreen.main.bounds)
        // 根据登录状态选择根视图
        let rootView = isLoggedIn ? WelcomeScreen() : LoginView()
        window?.rootViewController = UIHostingController(rootView: rootView)
        window?.makeKeyAndVisible()
        
        return true
    }
    
  2. 如果你的TegKeychain.get返回的是字符串类型(比如存储的是"true"/"false"),需要先做类型转换:

    let loggedInString = TegKeychain.get("ISLOGGEDIN") as? String ?? "false"
    let isLoggedIn = loggedInString.lowercased() == "true"
    
  3. 后续登录状态变化时(比如用户登录成功),可以通过更新window的根视图来切换页面:

    // 示例:在登录成功的回调中执行
    if let window = UIApplication.shared.windows.first {
        window.rootViewController = UIHostingController(rootView: WelcomeScreen())
    }
    

另外提一句,如果后续你想更贴合SwiftUI的开发模式,也可以考虑迁移到App协议的项目结构,用状态管理(比如@AppStorage或者自定义ObservableObject)来控制根视图的切换,但基于你当前的代码结构,上面的方案是最直接有效的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:02:52