删除SceneDelegate是否正确?SwiftUI无Storyboard项目如何设置根视图?
嘿,我来帮你理清这两个问题:
关于SceneDelegate的必要性
对于你的情况——只支持iPhone、使用SwiftUI且无Storyboard,确实不需要SceneDelegate相关内容。SceneDelegate是iOS 13引入的组件,核心作用是支持多场景功能(比如iPad的多窗口显示、App切换时的场景生命周期管理)。如果你的项目只针对单场景的iPhone设备,完全可以放心移除它,保留AppDelegate的传统窗口管理方式完全能满足需求。
实现登录状态驱动的视图切换
你现在的AppDelegate结构完全可以直接实现根据登录状态展示不同视图的需求,具体步骤如下:
在
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 }如果你的
TegKeychain.get返回的是字符串类型(比如存储的是"true"/"false"),需要先做类型转换:let loggedInString = TegKeychain.get("ISLOGGEDIN") as? String ?? "false" let isLoggedIn = loggedInString.lowercased() == "true"后续登录状态变化时(比如用户登录成功),可以通过更新window的根视图来切换页面:
// 示例:在登录成功的回调中执行 if let window = UIApplication.shared.windows.first { window.rootViewController = UIHostingController(rootView: WelcomeScreen()) }
另外提一句,如果后续你想更贴合SwiftUI的开发模式,也可以考虑迁移到App协议的项目结构,用状态管理(比如@AppStorage或者自定义ObservableObject)来控制根视图的切换,但基于你当前的代码结构,上面的方案是最直接有效的。
内容的提问来源于stack exchange,提问作者Utku Dalmaz
相关产品推荐
相关产品推荐

