SwiftUI如何使用 @EnvironmentObject 在视图之间共享数据?

17 min read

在SwiftUI中使用 @EnvironmentObject来在视图之间共享数据,可以通过以下步骤实现:

  1. 在应用程序中定义一个ObservableObject类型的类。
class UserData: ObservableObject {
    @Published var name = "John"
}
  1. 在SceneDelegate中创建并注入该类的实例,使其可以在整个应用程序中使用。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    let userData = UserData()
    
    let contentView = ContentView().environmentObject(userData)
    
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: contentView)
        self.window = window
        window.makeKeyAndVisible()
    }
}
  1. 在需要访问共享数据的视图中使用@EnvironmentObject属性包装器来创建一个引用并使用。
struct ProfileView: View {
    @EnvironmentObject var userData: UserData
    
    var body: some View {
        VStack {
            Text("Name: \(userData.name)")
        }
    }
}

这样就可以在不同的视图中使用userData实例来访问、更改和共享数据。注意:在使用@EnvironmentObject时,先在某个父视图中注入该对象,然后在子视图中访问该对象。如果没有先注入,则会发生运行时错误。