SwiftUI视图切换时如何指定跳转后的初始显示页面
问题根因
- 编译报错来自Preview段的错误传参:你写的
showThisPage: Page传入的是Page枚举的类型本身,不是枚举的具体case值,类型不匹配。 - 逻辑缺陷:你给SwitchView传入了
showThisPage参数,但没有在视图加载时把这个值设置为路由的初始页面,ViewRouter初始化时硬编码了默认值.login,所以永远会先加载登录页。 - 状态对象初始化问题:
@StateObject由当前视图持有生命周期,直接在属性声明处实例化会导致你无法从外部传入自定义初始值,必须通过视图的init方法完成状态对象的初始化配置。
正确实现代码
1. 修改ViewRouter,支持自定义初始页
给ViewRouter增加带默认值的初始化方法,保留默认跳转登录页的逻辑,同时支持外部指定初始页面:
import SwiftUI class ViewRouter: ObservableObject { @Published var currentPage: Page init(initialPage: Page = .login) { currentPage = initialPage } }
2. 重写SwitchView的初始化逻辑
通过自定义init方法,把传入的目标页面作为ViewRouter的初始值,同时修复Preview的传参错误:
import SwiftUI struct SwitchView: View { @StateObject private var viewRouter: ViewRouter private let showThisPage: Page init(showThisPage: Page) { self.showThisPage = showThisPage // 初始化路由时直接绑定传入的初始页面 _viewRouter = StateObject(wrappedValue: ViewRouter(initialPage: showThisPage)) } var body: some View { switch viewRouter.currentPage { case .login: Login(viewRouter: viewRouter) case .register: CreateAccount(viewRouter: viewRouter) } } } struct SwitchView_Previews: PreviewProvider { static var previews: some View { // 传入具体枚举case修复类型报错 SwitchView(showThisPage: .register) } }
3. 调整ContentView的跳转代码
NavigationLink跳转时直接传入需要默认展示的页面即可,不需要额外在父视图初始化ViewRouter:
// 示例NavigationLink代码 NavigationLink { SwitchView(showThisPage: .register) } label: { Text("跳转注册页") }
补充说明:如果你的业务场景需要在多个跨层级视图之间共享同一个路由实例,把SwitchView里的@StateObject替换为@ObservedObject,在父视图持有ViewRouter实例传入即可,初始化时将currentPage赋值为传入的showThisPage就能实现相同效果。
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

