SwiftUI 属性包装器系列 --- @Environment @EnvironmentObject

@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将立即在环境中搜索正确类型的对象。如果找不到这样的对象(情况:忘记将其放置在环境中),那么应用程序将立即崩溃。

相关推荐
初级代码游戏7 小时前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏9 小时前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui12 小时前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhangfeng113315 小时前
CSDN星图 支持大模型微调 trl axolotl Unsloth 趋动云 LLaMA-Factory Unsloth ms-swift 模型训练
服务器·人工智能·swift
zhyongrui2 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
大熊猫侯佩2 天前
Neo-Cupertino 档案:撕开 Actor 的伪装,回归 Non-Sendable 的暴力美学
swift·observable·actor·concurrency·sendable·nonsendable·data race
大熊猫侯佩2 天前
赛博深渊(上):用 Apple Foundation Models 提炼“禁忌知识”的求生指南
llm·swiftui·大语言模型·foundationmodel·apple ai·apple 人工智能·summarize
zhyongrui3 天前
SwiftUI 光晕动画性能优化:消除托盘缩放卡顿的实战方案
ios·性能优化·swiftui
2501_915921434 天前
在没有源码的前提下,怎么对 Swift 做混淆,IPA 混淆
android·开发语言·ios·小程序·uni-app·iphone·swift
00后程序员张4 天前
对比 Ipa Guard 与 Swift Shield 在 iOS 应用安全处理中的使用差异
android·开发语言·ios·小程序·uni-app·iphone·swift