Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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
Ios 在swiftUi中跨视图更改结构内的数据_Ios_Swift_Swiftui - Fatal编程技术网

Ios 在swiftUi中跨视图更改结构内的数据

Ios 在swiftUi中跨视图更改结构内的数据,ios,swift,swiftui,Ios,Swift,Swiftui,我想在多个视图之间共享数据,但更改只影响本地,我希望是全局的,swift或特定的SwiftUI是否有方法全局更改数据?? (注:无约束力) 我的主要观点 struct UIController: View { @ObservedObject var userAuth = AuthUser() // I want to affect this value, isLogin @State var showLogin:Bool = true var body: some Vie

我想在多个视图之间共享数据,但更改只影响本地,我希望是全局的,swift或特定的SwiftUI是否有方法全局更改数据?? (注:无约束力)

我的主要观点

struct UIController: View {
    @ObservedObject var userAuth = AuthUser() // I want to affect this value, isLogin
    @State var showLogin:Bool = true
    var body: some View {
        ZStack {
            homeLogin()
                .fullScreenCover(isPresented: $userAuth.isLogin, content: AfterLogin.init)
            Text("\(String(self.userAuth.isLogin))")
        }
    }
}

更改值的视图:

struct LoginForm: View {
    @StateObject var userAuth = AuthUser()
    @State var username:String = ""
    @State var passwd:String = ""
    @State var isShowPasswd:Bool = false
    var body: some View {
Button(action: {
                    self.userAuth.isLogin = true
                }) {
                    RoundedRectangle(cornerRadius: 10)
                        .frame(width: UIScreen.screenWidth-100, height: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
                        .foregroundColor(.purple)
                        .overlay(
                            Text("Log In")
                                .fontWeight(.semibold)
                                .foregroundColor(.white)
                                .font(Font.system(size: 20, design: .rounded)))
                }
  }
}


要启用将导致您的SwiftUI视图更新的数据共享/设置,您可以实施以下策略:

  • a)使用单独的类使用
    observegeobject
    保存数据,或b)使您的
    AuthUser
    符合
    observegeobject
    协议。使用
    @Published
    属性包装器对您希望可用于SwiftUI视图的数据进行包装:
  • SceneDelegate
    中,在
    ContentView
    上设置
    .environmentObject
    视图修饰符,传递对
    AuthUser
    的引用:
  • 在SwiftUI视图中,使用
    @EnvironmentObject
    属性包装器使数据可用:
  • 可以随意使用
    swiftUIauth.someProperty
    。如果值更改,您的SwiftUI视图将更新
  • class AuthUser: ObservableObject {
        @Published var someProperty: Bool = false
    }
    
        static let authUser = AuthUser()
        
    
        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            let contentView = ContentView()
    
            if let windowScene = scene as? UIWindowScene {
                let window = UIWindow(windowScene: windowScene)
                window.rootViewController = UIHostingController(rootView: contentView.environmentObject(SceneDelegate.authUser))
                self.window = window
                window.makeKeyAndVisible()
            }
        }
    
    struct LoginForm: View {
        @EnvironmentObject var swiftUIauth: AuthUser
    
        var body: some View {
           ...