SwiftUI点击Skip按钮后视图未更新切换至TransitionView问题求助
问题分析与解决方案
核心问题
你的代码中,OnboardingView 和 SkipButtonView 各自创建了独立的 ShowTransition 实例——点击按钮修改的是按钮视图内的状态,而控制视图切换的是引导页视图内的另一个状态,两者完全无关,因此引导页不会刷新。
另外,ShowTransition 类里的 Combine 订阅代码是多余的:@Published 属性会自动发送状态变更通知,手动调用 objectWillChange.send() 属于重复操作,甚至可能干扰状态更新逻辑。
修复步骤
1. 简化 ShowTransition 类
移除多余的 Combine 代码,保留最基础的状态定义与切换方法:
import SwiftUI class ShowTransition: ObservableObject { @Published var showTransition = false func showTransitionToggle() { showTransition.toggle() } }
2. 在 OnboardingView 中共享状态实例
- 使用
@StateObject(SwiftUI 2.0+ 推荐)持有唯一的状态实例,确保其生命周期与视图绑定 - 将实例注入到环境中,让子视图可以共享访问
struct OnboardingView: View { // ... 原有属性 @StateObject private var showTransition = ShowTransition() // 替换原@ObservedObject var body: some View { ZStack { if showSplash { SplashView() .transition(.opacity) .animation(.easeOut(duration: 1.5)) } else if showTransition.showTransition { // 简化判断逻辑 TransitionView() } else { // ... 原有引导页内容 } } .onAppear { // ... 原有启动逻辑 } .environmentObject(showTransition) // 注入环境,供子视图使用 } }
3. 修改 SkipButtonView 共享状态
不再创建独立实例,而是通过 @EnvironmentObject 获取父视图注入的共享状态:
struct SkipButtonView: View { @AppStorage("isOnboarding") var isOnboarding: Bool? @EnvironmentObject var showTransition: ShowTransition // 从环境获取共享实例 var body: some View { HStack { Button(action: { showTransition.showTransitionToggle() print(showTransition.showTransition) }) { // ... 原有按钮样式代码 } } } }
4. 预览补充(可选)
如果需要在预览中测试,需给预览视图添加环境对象:
struct OnboardingView_Previews: PreviewProvider { static var previews: some View { OnboardingView() .environmentObject(ShowTransition()) } }
关键说明
@StateObject用于在视图中创建并持有ObservableObject实例,确保视图生命周期内实例唯一且稳定@EnvironmentObject用于在子视图中获取父视图注入的共享状态,避免多层视图传递参数的繁琐@Published会自动处理状态变更的通知,无需手动调用objectWillChange
内容的提问来源于stack exchange,提问作者Jesse Rae
相关产品推荐
相关产品推荐

