首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏韦弦的偶尔分享

    SwiftUI:使用 @EnvironmentObject 从环境中读取自定义值

    好吧,@ EnvironmentObject更进一步:我们可以将对象放置到环境中,以便任何子视图都可以自动访问它。 使用@EnvironmentObject,视图A可以将对象放入环境中,视图E可以从环境中读取对象,而视图B,C和D不必知道发生了什么。 这些将使用@EnvironmentObject属性包装器来表示此数据的值来自环境,而不是在本地创建: struct EditView: View { @EnvironmentObject var 现在,您可能想知道SwiftUI如何在.environmentObject(user)和@EnvironmentObject var user: User之间建立连接——如何知道将该对象放入正确的属性? 译自 Reading custom values from the environment with @EnvironmentObject

    11.1K20发布于 2020-09-10
  • 来自专栏Swift社区

    SwiftUI 与前端框架(如 React)中的状态管理对比

    @EnvironmentObject@EnvironmentObject 是适用于全局状态的解决方案,它用于在多个视图层次间共享状态。 SwiftUI 中的应用与挑战状态管理简化:SwiftUI 的 @State 和 @EnvironmentObject 使得状态管理变得直观。 例如,如果多个子视图都依赖于同一 @EnvironmentObject,任何一个子视图的状态变化都可能影响其他视图。 答:可以使用 @EnvironmentObject 或 ObservableObject 来在多个视图间共享状态,这样可以避免手动在组件层次间传递状态。 Q3: React 的 useContext 可以实现类似 SwiftUI 的 @EnvironmentObject 吗?

    3.8K10编辑于 2024-09-26
  • 来自专栏iOS 备忘录

    SwiftUI中navigationDestination用法

    } label: { Text("NavigateToD") } } .environmentObject for: CustomScreens.self) { path in navCoordinator.navigate(to: path) .environmentObject (navCoordinator) .environmentObject(xxx) .environmentObject(yyy) } } } } struct D: View { @EnvironmentObject var cNavCoordinator: CNavCoordinator label: { Text("NavigateToD") } } } } struct E: View { @EnvironmentObject

    79410编辑于 2024-11-20
  • 来自专栏肘子的Swift记事本

    SwiftUI 4.0 的全新导航系统

    (store) } } struct SideBarView: View { @EnvironmentObject var store: MyStore var body: some store.selection = i } } } } struct DetailView: View { @EnvironmentObject (store) } } struct SideBarView: View { @EnvironmentObject var store: MyStore var body: some (store) } } struct SideBarView: View { @EnvironmentObject var store: MyStore var body: some (store) } } struct SideBarView: View { @EnvironmentObject var store: MyStore var body: some

    12.4K62编辑于 2022-07-28
  • 来自专栏学海无涯

    SwiftUI-数据流

    五个数据流工具 可以通过它们建立数据和视图的依赖关系 Property @State @Binding ObservableObject @EnvironmentObject 注意:后面四种使用 Swift 组件层级嵌套太深,就会出现数据逐层传递的问题, @EnvironmentObject可以帮助组件快速访问全局数据,避免不必要的组件数据传递问题。 使用基本与@ObservedObject一样,但@EnvironmentObject突出强调此数据将由某个外部实体提供,所以不需要在具体使用的地方初始化,而是由外部统一提供。 使用@EnvironmentObject,SwiftUI 将立即在环境中搜索正确类型的对象。如果找不到这样的对象,则应用程序将立即崩溃。 @ObservedObject、 @EnvironmentObject 一般修饰的都是 View 外部的数据: 系统级的消息 网络或本地存储的数据 界面之间互相传递的数据

    11.1K20发布于 2020-02-18
  • 来自专栏肘子的Swift记事本

    探讨 SwiftUI 中的几个关键属性包装器

    @EnvironmentObject @EnvironmentObject 是用于在当前视图中与上层视图经环境传递的 ObservableObject 实例之间创建关联的属性包装器。 注意事项 使用 @EnvironmentObject 前,必须确保已在视图层级的上游提供了相应的实例( 通过 .environmentObject 修饰器 ),否则将导致运行时错误。 注意事项 相较于由 @EnvironmentObject 提供的实例所应对的复杂逻辑,@Environment 引入的数据通常的功能更加的专一。 与 @EnvironmentObject 不同,低层级视图不能修改由祖先视图传递下来的 EnvironmentValue 的值。 总结 @StateObject、@ObservedObject 和 @EnvironmentObject 专用于关联符合 ObservableObject 协议的实例。

    3.4K10编辑于 2023-12-21
  • 来自专栏移动端开发

    解析SwiftUI布局细节(二)循环轮播+复杂布局

    content: { /// Banner视图 HomeBannerView() .environmentObject (homeViewModel) /// 最美的风景 HomeSnapshotView().environmentObject (homeViewModel) }).navigationTitle(title) } 这部分的代码没有啥特别需要说明的,都比较简单,可能是就是这个 environmentObject 通过它我们可以避免在初始 View 时创建 ObservableObject, 而是从环境中获取 ObservableObject,像 @EnvironmentObject,@ObservedObject 首页顶部自动循环轮播的代码实现如下,代码里有些注释还是比较重要的,注意看注释: struct HomeBannerView: View { @EnvironmentObject var

    13.9K20发布于 2021-01-06
  • 来自专栏肘子的Swift记事本

    解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

    store.show.toggle() } .sheet(isPresented: $store.show) { SheetView() .environmentObject (store) } } } struct SheetView: View { @Environment(\.dismiss) var dismiss @EnvironmentObject .navigationDestination(for: Int.self) { n in Row(n: n) .environmentObject store) } } } } struct Row: View { @Environment(\.dismiss) var dismiss @EnvironmentObject (pathHolder) } } struct DetailView: View { @EnvironmentObject var holder: PathHolder var

    3.1K20编辑于 2023-09-06
  • 来自专栏站长的编程笔记

    【说站】java接口类型有哪些

    // null interface public interface EnvironmentObject{}   // public interface Agent extends EnvironmentObject

    1.2K30编辑于 2022-11-23
  • 来自专栏肘子的Swift记事本

    解析 SwiftUI 中两处由状态更新滞后引发的严重 Bug

    store.show.toggle() } .sheet(isPresented: $store.show) { SheetView() .environmentObject (store) } }}struct SheetView: View { @Environment(\.dismiss) var dismiss @EnvironmentObject .navigationDestination(for: Int.self) { n in Row(n: n) .environmentObject (store) } } }}struct Row: View { @Environment(\.dismiss) var dismiss @EnvironmentObject (pathHolder) }}struct DetailView: View { @EnvironmentObject var holder: PathHolder var body:

    4.1K110编辑于 2023-09-01
  • 来自专栏肘子的Swift记事本

    @StateObject 研究

    在SwiftUI 1.0时代,如果想将引用类型作为source of truth,通常的方法是使用@EnvironmentObject或者 @ObservedObject。 struct RootView:View{ var body: some View{ ContentView() .environmentObject(Store ()) }}struct ContentView: View { @EnvironmentObject var store1:Store var body: some View { Text("count:\(store.count)") }} 对于使用@EnvironmentObject注入的数据,由于其通常是在SceneDelegate或者当前View的父辈、祖先View

    1.7K40编辑于 2022-07-28
  • 来自专栏静之森

    从零开始的 Swift UI (二)

    在 MeetApp.swift 中挂载 Like 为 environmentObject。增加如下代码。 } 24 .tag(1) 25 } 26 .accentColor(.pink) 27+ .environmentObject createdAt: Date(), from: model.from, author: model.creator)) 8 } COPY 在顶部增加 swift 1 @EnvironmentObject var like: Like COPY 完整如下 swift 1struct ActionView: View { 2 @EnvironmentObject var like: Like 3 4 的属性会自动获取上层 View 挂载的 environmentObject,不需要层层传递。

    1.8K20编辑于 2021-12-28
  • 来自专栏静之森

    从零开始的 Swift UI (三)

    swift 1struct LikeView: View { 2 @EnvironmentObject var like: Like 3 4 var likes: [LikeModel] { 5 3 @EnvironmentObject var like: Like 4 5 var liked: Bool { 6 guard let model = model else

    78220编辑于 2021-12-28
  • 来自专栏正则

    架构之路 (六) —— VIPER架构模式(二)

    connectionOptions: UIScene.ConnectionOptions) { model.load() let contentView = ContentView() .environmentObject ContentView.swift import SwiftUI struct ContentView: View { @EnvironmentObject var model: DataModel static var previews: some View { let model = DataModel.sample return ContentView() .environmentObject let trip = model.trips[0] return TripListCell(trip: trip) .frame(height: 160) .environmentObject interactor: WaypointViewInteractor(waypoint: Waypoint(), mapInfoProvider: provider))) .environmentObject

    1.5K10发布于 2021-09-04
  • 来自专栏Swift社区

    WWDC 23 之后的 SwiftUI 有哪些新功能

    await store.fetch() } } } } 以前,有一系列的属性包装器,如 State、StateObject、ObservedObject 和 EnvironmentObject 不需要使用 @EnvironmentObject 属性包装器或 environmentObject 视图修饰符。同样的 Environment 属性包装器现在适用于可观察类型。

    2.5K20编辑于 2023-09-06
  • 来自专栏Swift社区

    SwiftUI 状态管理系统指南

    一种是首先在想要检索给定对象的视图中定义一个EnvironmentObject包装的属性——例如像这个ArticleView如何检索一个包含颜色信息的Theme对象: struct ArticleView : View { @EnvironmentObject var theme: Theme var article: Article var body: some View { var body: some View { ArticleListView(articles: articleLibrary.articles) .environmentObject set { self[ThemeEnvironmentKey.self] = newValue } } } 有了上述内容,我们现在可以使用Enviroment属性包装器(而不是EnvironmentObject foregroundColor(theme.bodyTextColor) } } } 上述两种方法的一个明显区别是,基于键的方法要求我们在编译时定义一个默认值,而基于环境对象EnvironmentObject

    6.5K20编辑于 2022-07-05
  • 来自专栏肘子的Swift记事本

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    在使用 environmentObject 的情况下,如何避免创建实例的视图被重新计算Q:如何在避免重新计算顶层视图 body 的情况下,在不同子树的两个子视图之间共享状态( 例如 ObservableObject 比如说我可以在父级视图中拥有 StateObject,并通过 EnvironmentObject 传递该对象。然而,如果里面的 @Published 属性改变了,父视图和它的子树也都被重新计算。 A:EnvironmentObject 是一个很好的工具。如果你不想让父视图也被更新,可以在创建对象时不使用 @StateObject 或 @ObservedObject 。 @ToolbarContentBuilder 已经提供了对 if else 的支持,而且可以在符合 ToolbarContent 的自定义类型中使用 @Environment / @EnvironmentObject A:@EnvironmentObject / environmentObject 可能是跨视图层次共享同一模型的最佳工具。使用它们应该只创建一个实例,然后可以在子视图中读取。

    15.9K20编辑于 2023-03-08
  • 来自专栏肘子的Swift记事本

    用Async/Await重建SwiftU的Redux-like状态容器

    store = Store() var body: some Scene { WindowGroup { ContentView() .environmentObject store = Store() var body: some Scene { WindowGroup { ContentView() .environmentObject

    2.4K20编辑于 2022-07-28
  • 来自专栏肘子的Swift记事本

    肘子的 Swift 周报 #017 | 新博客的数据盘点

    第一部分为 探讨 SwiftUI 中的关键属性包装器:@State、@Binding、@StateObject、@ObservedObject、@EnvironmentObject 和 @Environment https://twitter.com/fatbobman [4] 探讨 SwiftUI 中的关键属性包装器:@State、@Binding、@StateObject、@ObservedObject、@EnvironmentObject

    37110编辑于 2024-02-05
  • 来自专栏肘子的Swift记事本

    避免 SwiftUI 视图的重复计算

    的不断发展,这类的属性包装器越来越多,已知的有( 截至 SwiftUI 4.0):@AccessibilityFocusState、@AppStorage、@Binding、@Environment、@EnvironmentObject 例如下面的代码: struct EnvObjectDemoView:View{ @EnvironmentObject var store:Store var body: some View 其他建议 需要跳跃视图层级时,考虑使用 Environment 或 EnvironmentObject 对于不紧密的 State 关系,考虑在同一个视图层级使用多个 EnvironmentObject

    11K81编辑于 2022-08-03
领券