[英]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 視圖更新的數據共享/設置,您可以實施以下策略:
ObservableObject
保存數據,或者 b) 使您的AuthUser
符合ObservableObject
協議。 對您希望 SwiftUI 視圖可用的數據使用@Published
屬性包裝器:class AuthUser: ObservableObject {
@Published var someProperty: Bool = false
}
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()
}
}
@EnvironmentObject
屬性包裝器使數據可用:struct LoginForm: View {
@EnvironmentObject var swiftUIauth: AuthUser
var body: some View {
...
swiftUIauth.someProperty
但是你喜歡。 如果值更改,您的 SwiftUI 視圖將更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.