我对SwiftUI还很陌生,我觉得我在一些感觉非常简单的东西上遇到了麻烦.虽然,我已经在这上面花了几个小时,需要一些帮助.我有我的入职观点.我正在try 做的是,当我点击跳过按钮时,它应该会显示一个过渡视图.我将跳过按钮从True切换到False以显示过渡屏幕.我的问题是,当我点击跳过按钮时,它不会刷新入职视图以显示过渡屏幕.

OnboardingView

import SwiftUI

struct OnboardingView: View {
    
    //MARK: - PROPERTIES
    var onboardings: [Onboarding] = OnboardingData
    @State private var isAnimating: Bool = false
    @State private var showSplash = true
    @ObservedObject var showTransition = ShowTransition()
    
    //MARK: - BODY
    var body: some View {
        
        ZStack {
            if showSplash {
                SplashView()
                    .transition(.opacity)
                    .animation(.easeOut(duration: 1.5))
            } else if showTransition.showTransition == true {
                TransitionView()
            } else {
                GeometryReader { geometry in
                    ZStack {
                        Image("Endero Background-LightMode").resizable().aspectRatio(geometry.size, contentMode: .fill).edgesIgnoringSafeArea(.all)
                    }
                    
                    Text("Welcome")
                        .font(.system(size: 48, weight: .heavy))
                        .frame(maxWidth: .infinity, alignment: .center)
                        .padding(.top, 23)
                        .foregroundColor(.black)
                }
                TabView {
                    ForEach(onboardings[0...4]) { item in
                        OnboardingCardView(onboarding: item)
                    }
                }
                .tabViewStyle(PageTabViewStyle())
            }
        }
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3)
            {
                withAnimation {
                    self.showSplash = false
                }
            }
        }
    } // End Body
}

OnboardingCardView

import SwiftUI

struct OnboardingCardView: View {
    //MARK: - PROPERTIES
    
    var onboarding: Onboarding
    @State private var isAnimating: Bool = false
    
    //MARK: - BODY
    
    var body: some View {
        ZStack {
            VStack {
                //ONBOARDING: BODY
                Text(onboarding.body)
                    .foregroundColor(Color.black)
                    .font(.system(size: 32))
                    .multilineTextAlignment(.center)
                    .fontWeight(.bold)
                    .padding(.top, 125)
                    .padding(.horizontal, 16)
                    .frame(maxWidth:480)
                
                //BUTTON: SKIP
                Spacer()
                    SkipButtonView()
                        .padding(.horizontal, 16)
                        .padding(.bottom, 40)
            } //VStack
        } //ZStack
        .onAppear {
            withAnimation(.easeOut(duration: 0.5)) {
                isAnimating = true
            }
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Image(onboarding.background))
        .cornerRadius(26)
        .padding(.horizontal, 24)
        .padding(.top, 120)
        .padding(.bottom, 70)
    } //END BODY
}

Skip Button View

import SwiftUI
import Combine

//MARK: - OBSERVABLES
class ShowTransition: ObservableObject {
    @Published var showTransition = false
    private var cancellable: AnyCancellable?
    
    init() {
        cancellable = $showTransition
            .sink { [weak self] _ in
                self?.objectWillChange.send()
            }
    }
    
    func showTransitionToggle() {
        showTransition.toggle()
    }
}

struct SkipButtonView: View {
    // MARK: - PROPERTIES
    
    @AppStorage("isOnboarding") var isOnboarding: Bool?
    @ObservedObject var showTransition = ShowTransition()
    
    // MARK: - BODY
    
    var body: some View {
        
        HStack {
            Button(action: {
                showTransition.showTransitionToggle()
                print(showTransition.showTransition)
            }) {
                Text("SKIP")
                    .font(.system(size: 29))
                    .fontWeight(.semibold)
                    .foregroundColor(.white)
                
                    .background(
                        Capsule().strokeBorder(Color.white, lineWidth: 2.5).frame(width: 300, height: 50, alignment: .center)
                    )
                    .accentColor(Color.white)
            }
        }
    }
}

当我在应用程序开始时将showTransition值设置为True时,它会显示转换屏幕.所以我觉得问题在于,当我点击跳过按钮以显示过渡屏幕时,并没有刷新入网视图以显示过渡视图.

推荐答案

您正在SkipButtonView中创建一个ShowTransition的新实例,这就是更改不会传播到OnboardingView的原因.要解决此问题,您可以:

  • ShowTransition对象传递给SkipButtonView
  • 或者用EnvironmentObjectShowTransition注入SkipButtonView:
//Injecting
.environmentObject(showTransition)

//Reading
@EnvironmentObject var showTransition: ShowTransition

Note:正如@vadian所指出的,init是不必要的,ShowTransition简化为:

class ShowTransition: ObservableObject {
    @Published var showTransition = false
    func showTransitionToggle() {
        showTransition.toggle()
    }
}

Example passing the object:

SkipButtonView:

struct SkipButtonView: View {
    // MARK: - PROPERTIES
    @AppStorage("isOnboarding") var isOnboarding: Bool?
    @ObservedObject var showTransition: ShowTransition //Update
    
    // MARK: - BODY
    var body: some View {
        HStack {
            Button(action: {
                showTransition.showTransitionToggle()
                print(showTransition.showTransition)
            }) {
                Text("SKIP")
                    .font(.system(size: 29))
                    .fontWeight(.semibold)
                    .foregroundColor(.white)
                
                    .background(
                        Capsule().strokeBorder(Color.white, lineWidth: 2.5).frame(width: 300, height: 50, alignment: .center)
                    )
                    .accentColor(Color.white)
            }
        }
    }
}

OnboardingCardView:

struct OnboardingCardView: View {
    //MARK: - PROPERTIES
    @ObservedObject var showTransition: ShowTransition //Updated
    var onboarding: Onboarding
    @State private var isAnimating: Bool = false
    
    //MARK: - BODY
    
    var body: some View {
        ZStack {
            VStack {
                //ONBOARDING: BODY
                Text(onboarding.body)
                    .foregroundColor(Color.black)
                    .font(.system(size: 32))
                    .multilineTextAlignment(.center)
                    .fontWeight(.bold)
                    .padding(.top, 125)
                    .padding(.horizontal, 16)
                    .frame(maxWidth:480)
                
                //BUTTON: SKIP
                Spacer()
                SkipButtonView(showTransition: showTransition) //Updated
                    .padding(.horizontal, 16)
                    .padding(.bottom, 40)
            } //VStack
        } //ZStack
        .onAppear {
            withAnimation(.easeOut(duration: 0.5)) {
                isAnimating = true
            }
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Image(onboarding.background))
        .cornerRadius(26)
        .padding(.horizontal, 24)
        .padding(.top, 120)
        .padding(.bottom, 70)
    } //END BODY
}

OnboardingView:

struct OnboardingView: View {
    
    //MARK: - PROPERTIES
    var onboardings: [Onboarding] = OnboardingData
    @State private var isAnimating: Bool = false
    @State private var showSplash = true
    @StateObject var showTransition = ShowTransition() //Updated: use @StateObject for the root object
    
    //MARK: - BODY
    var body: some View {
        
        ZStack {
            if showSplash {
                SplashView()
                    .transition(.opacity)
                    .animation(.easeOut(duration: 1.5))
            } else if showTransition.showTransition == true {
                TransitionView()
            } else {
                GeometryReader { geometry in
                    ZStack {
                        Image("Endero Background-LightMode").resizable().aspectRatio(geometry.size, contentMode: .fill).edgesIgnoringSafeArea(.all)
                    }
                    
                    Text("Welcome")
                        .font(.system(size: 48, weight: .heavy))
                        .frame(maxWidth: .infinity, alignment: .center)
                        .padding(.top, 23)
                        .foregroundColor(.black)
                }
                TabView {
                    ForEach(onboardings[0...4]) { item in
                        OnboardingCardView(showTransition: showTransition, onboarding: item) //Updated
                    }
                }
                .tabViewStyle(PageTabViewStyle())
            }
        }
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3)
            {
            withAnimation {
                self.showSplash = false
            }
            }
        }
    } // End Body
}

Ios相关问答推荐

SwiftData在获取值时应用程序崩溃:线程1:EXC_BREAKPOINT(代码=1,子代码=0x101e8303c)

JSON响应中的键有时为Int,有时为字符串

当虚拟对象附加到其网格时,如何刷新创建 ARView 的 SwiftUI UIViewRepresentable?

当任何 TextEditor 有多于一行时,所有 TextEditor 都会调整大小

使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

'DismissAction'类型的值没有成员'wrappedValue'在SwiftUI的Xcode中

.onChange(of: ) 一次用于多个 @State 属性?

将值传递给导航链接视图中的文本框

swiftUI中的剪辑形状无法使用旋转效果

SwiftUI - 在ForEach的每个元素之间自动添加分隔符

iOS 8 - 使用自定义演示关闭视图控制器后屏幕空白

UICollectionView - 动态单元格高度?

如何比较两个 UIImage 对象

iOS 中的 Crashlytics 不会继续通过 Fabric 应用程序中的构建您的项目

在 iOS 7 上更改标签栏色调 colored颜色

如何像在 Facebook 应用程序中一样以编程方式打开设置?

在 iOS 上存储身份验证令牌 - NSUserDefaults 与 keys 串?

判断密钥是否存在于 NSDictionary 中

文件是为存档而构建的,它不是被链接的体系 struct (i386)

比较没有时间分量的 NSDates