簡體   English   中英

在 swiftUi 中跨視圖更改結構內的數據

[英]Change data within a struct across views in 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 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 視圖更新的數據共享/設置,您可以實施以下策略:

  1. a) 使用單獨的 class 使用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 視圖將更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM