@Environment
SwiftUI 使用环境 来传递系统范围的设置,如ContentSizeCategory、LayoutDirection、ColorScheme 等。
@Environment用于从环境中读取值。如果环境中的值发生变化,您的视图就会更新。不能使用此属性包装器来设置或修改环境属性。
1、环境中读取值:
swift
struct MyView: App {
@Environment(.colorScheme) var colorScheme: ColorScheme
var body: some View {
Text("The color scheme is (colorScheme == .dark ? "dark" : "light")")
}
}
2、要在视图上设置@Environment
属性,需要使用.environment
视图修饰符。:
scss
ContentView()
.environment(.managedObjectContext, Persistence.shared.viewContext)
3、自定义属性添加到视图的环境中,如下所示:
swift
//枚举
enum AppStyle {
case classic,
case modern,
}
// 设置默认枚举
private struct AppStyleKey: EnvironmentKey {
static let defaultValue = AppStyle.modern
}
// 注册枚举key 到环境里
extension EnvironmentValues {
var appStyle: AppStyle {
get { self[AppStyleKey.self] }
set { self[AppStyleKey.self] = newValue }
}
}
// 使用
ContentView().environment(.appStyle, .classic)
@EnvironmentObject
SwiftUI 的@EnvironmentObject
属性包装器允许我们创建依赖于共享数据的视图,通常使用在整个应用程序。
有时应用程序中的各个位置都需要某个对象,并且不希望用传递参数的方式给创建的每个视图的初始值设定项。
标记为@EnvironmentObject
的属性必须符合ObservableObject
. 它们由@EnvironmentObject
使用.
scss
class UserInfo: ObservableObject {
@Published var name = ''
}
struct EnvironmentUsingView: View {
@EnvironmentObject var userInfo: UserInfo
var body: some View {
Text(userInfo.name)
}
}
要在视图上设置@Environment
属性,需要使用.environmentObject
视图修饰符。:
scss
struct MyApp: App {
@StateObject var userInfo: UserInfo
var body: some Scene {
WindowGroup {
EnvironmentUsingView()
.environmentObject(userInfo)
}
}
}
@EnvironmentObject
与 @ObservedObject
共同点:
- 两者必须引用符合
ObservableObject
的类,- 两者可以在多个视图之间共享,并且两者都会在发生重大更改时更新正在观察的任何视图。
注意: 当显示@EnvironmentObject
视图时,SwiftUI将立即在环境中搜索正确类型的对象。如果找不到这样的对象(情况:忘记将其放置在环境中),那么应用程序将立即崩溃。