【问题标题】:Change data within a struct across views in swiftUi在swiftUi中跨视图更改结构内的数据
【发布时间】:2021-05-15 17:26:31
【问题描述】:

我想在多个视图之间共享数据,但更改只影响本地,我想要全局,有没有办法在 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)))
                }
  }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

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

    1. 要么 a) 使用单独的类来使用 ObservableObject 保存数据,要么 b) 使您的 AuthUser 符合 ObservableObject 协议。对您希望 SwiftUI 视图可用的数据使用 @Published 属性包装器:
    class AuthUser: ObservableObject {
        @Published var someProperty: Bool = false
    }
    
    1. SceneDelegate 中,在ContentView 上设置.environmentObject 视图修饰符,传入对AuthUser 的引用:
        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()
            }
        }
    
    1. 在您的 SwiftUI 视图中,使用 @EnvironmentObject 属性包装器使数据可用:
    struct LoginForm: View {
        @EnvironmentObject var swiftUIauth: AuthUser
    
        var body: some View {
           ...
    
    1. 随意使用swiftUIauth.someProperty。如果值更改,您的 SwiftUI 视图将更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多