Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个页面之间传递状态SwiftUI_Swift_Swiftui - Fatal编程技术网

在两个页面之间传递状态SwiftUI

在两个页面之间传递状态SwiftUI,swift,swiftui,Swift,Swiftui,我正在尝试使用新的SwiftUI重新创建旧版本的入职设置,当我尝试共享状态以使视图更改时,它根本不知道某些内容已更改,这就是我正在做的: 在main.swift结构(不是ContentView.swift)中,我定义了如下页面: @main struct AnotherAPP: App { @ObservedObject var onBoardingUserDefaults = OnBoardingUserDefaults() let persistenceC

我正在尝试使用新的SwiftUI重新创建旧版本的入职设置,当我尝试共享状态以使视图更改时,它根本不知道某些内容已更改,这就是我正在做的:

在main.swift结构(不是ContentView.swift)中,我定义了如下页面:

@main
struct AnotherAPP: App {
    
    @ObservedObject var onBoardingUserDefaults = OnBoardingUserDefaults()
    
    let persistenceController = PersistenceController.shared
    
    var body: some Scene {
        WindowGroup {
            // Onboarding screen
            if (onBoardingUserDefaults.isOnBoardingDone == false) {
                OnboardingPageView()
            } else {
                UserLoginView()
            }
        }
    }
}
@ObservedObject private var onBoardingUserDefaults = OnBoardingUserDefaults()
self.onBoardingUserDefaults.isOnBoardingDone = true
UserDefaults.standard.synchronize()
因此,在Onboard页面上,当我单击按钮转到登录时,它会存储它,但实际上不会刷新视图。(在OnboardingPageView.swift中)我这样调用UserDefaults:

@main
struct AnotherAPP: App {
    
    @ObservedObject var onBoardingUserDefaults = OnBoardingUserDefaults()
    
    let persistenceController = PersistenceController.shared
    
    var body: some Scene {
        WindowGroup {
            // Onboarding screen
            if (onBoardingUserDefaults.isOnBoardingDone == false) {
                OnboardingPageView()
            } else {
                UserLoginView()
            }
        }
    }
}
@ObservedObject private var onBoardingUserDefaults = OnBoardingUserDefaults()
self.onBoardingUserDefaults.isOnBoardingDone = true
UserDefaults.standard.synchronize()
在按钮上,我将其更改为:

@main
struct AnotherAPP: App {
    
    @ObservedObject var onBoardingUserDefaults = OnBoardingUserDefaults()
    
    let persistenceController = PersistenceController.shared
    
    var body: some Scene {
        WindowGroup {
            // Onboarding screen
            if (onBoardingUserDefaults.isOnBoardingDone == false) {
                OnboardingPageView()
            } else {
                UserLoginView()
            }
        }
    }
}
@ObservedObject private var onBoardingUserDefaults = OnBoardingUserDefaults()
self.onBoardingUserDefaults.isOnBoardingDone = true
UserDefaults.standard.synchronize()
发生了什么事


例如,我知道如果我在@main上创建一个@State并将其绑定到OnboardingPageView,它就会工作,只要我点击该按钮,它就会将我带到那里。

您可以使用
AppStorage
在多个视图中管理
用户默认值
变量:

@main
struct TestApp: App {
    @AppStorage("isOnBoardingDone") var isOnBoardingDone = false
    
    var body: some Scene {
        WindowGroup {
            if !isOnBoardingDone {
                OnboardingPageView(isOnBoardingDone: $isOnBoardingDone)
            } else {
                UserLoginView()
            }
        }
    }
}

struct OnboardingPageView: View {
    @Binding var isOnBoardingDone: Bool

    var body: some View {
        Button("Complete") {
            isOnBoardingDone = true
        }
    }
}

如果我理解正确,您正在尝试将内容视图中的状态变量的值传递给同一应用程序中的另一个视图。为简单起见,假设您的变量在ContentView中初始化如下:

@State private var countryIndex = 0 //Assuming the name of the variable is countryIndex  
现在,要传输该值,请在内容视图(或变量最初所在的位置)中写入以下内容:

在第二个视图或其他视图中,使用以下命令初始化名为valueFromContentView的绑定变量:

@Binding var valueFromContentView:Int

然后,向下滚动到创建预览的代码。仅供参考,它是另一个名为ViewName_Previews的
struct
:PreviewProvider{…}

如果您没有更改任何内容,则将是:

struct NextPage_Previews: PreviewProvider {
    static var previews: some View {
       
    }
}
记住,我的第二个视图叫做NextPage

在预览大括号内,输入代码:

 NextPage(valueFromContentView: .constant(0))
因此,现在为应用程序创建预览的代码如下所示:

struct NextPage_Previews: PreviewProvider {
    static var previews: some View {
        NextPage(valueFromContentView: .constant(0)) //This is what you add
    }
}
记住,NextPage是我视图的名称,valueFromContentView是我在上面初始化的绑定变量


像这样,您现在可以将一个视图中变量的值转移到另一个视图。

您可以将
OnBoardingUserDefaults
类的内容发布吗?这非常有效,谢谢。我不知道新的
@AppStorage
。我如何从另一个视图中读取该值?它是:
UserDefaults.standard.bool(forKey:“isOnBoardingDone”)==false
?@Arturo
AppStorage
只是
UserDefaults
之上的一个包装(仍然可以以正常方式访问)。你可以在这里读到更多:不,这不是我要问的哈哈,但谢谢。看看公认的答案