代码之家  ›  专栏  ›  技术社区  ›  E. Rivera

使用SwiftUI环境传递标准类型(Int、String等)以查看层次结构

  •  0
  • E. Rivera  · 技术社区  · 6 年前

    我知道我们可以通过海关 ObservableObject s类型使用 .environmentObject(_:) 然后使用 @EnvironmentObject

    但是我们要通过的是非定制的,标准的 Int , String 视图周围的属性?

    func environment<V>(_ keyPath: WritableKeyPath<EnvironmentValues, V>, _ value: V) -> some View

    但它似乎只适用于固定的,非定制的, KeyPath 例如 \.colorScheme

    @State 利用环境。

    0 回复  |  直到 6 年前
        1
  •  3
  •   John M.    6 年前

    太长,读不下去了

    @State Binding 到后代视图)。只是为了避免方便 ObservableObject 为每个视图分类。但是,如果要将数据传递到多个连接不紧密的视图,则应将数据包装在 上课并通过 .environmentObject()

    解释

    为什么? 你不能到处乱跑 @州 属性,让我们谈谈 @州 @ObservedObject , @EnvironmentObject , @Published ,和 @Binding 属性包装器实际上正在做。

    输入 可观察对象 协议。创建符合此协议的对象并标记其属性之一时 @出版 ,这只是一个很好的语法甜言蜜语,“我有一个引用对象,我打算表示状态;请建立一些联合发布服务器,在任何时候都可以广播。”因为它是一个引用类型,它可以放在内存中的某个地方, 外部 我们的视图,只要我们的视图引用了它并订阅了它的发布者,它们就可以知道它何时更改,并相应地刷新。

    但请记住,我们说过我们的视图是结构。即使您为它们的某个属性指定了对 可观察对象 如果订阅了它的发布者,每当重新创建结构时,我们就会丢失这些信息。这就是 @观察对象 包装纸进来了。实际上,所做的就是说,“存储对这个对象的引用和订阅 外部 在重新创建视图时,请确保我知道应该引用并侦听此对象。”

    ObservedObject 通过初始化器。相反,它说,“相信我,你的祖先中会有这种类型的物体。去问问他们吧。”

    所以说真的,这已经足够我们在斯威夫图做所有需要做的事情了。但是如果我只需要存储和观看 Bool 只需要在一个视图中进行更改?仅仅为了这一点就把全班的字体都写出来有点费力。在那里 @州 观察对象 @观察对象 东西。上面写着,“保留这些数据 外部 我的结构的内存(所以它不会在刷新时被丢弃),并在发生任何变化时通知我 @州 属性,即使修改结构的属性应重新创建该结构;但数据不是 在你的结构里面。

    可观察对象 @观察对象 包装器,它将只在一个结构中使用。

    @装订 . 有时,我们观点的直系后代可能需要修改 其祖先的变量(例如 TextField 需要修改 String 其父视图所持有的值)。这个 属性包装器只是意味着,“您不需要存储这个数据(因为它已经被另一个视图/对象存储了);您只需要查看它的更改并能够将更改写回。”

    注意:是的,在引擎盖下面, @州 还有一个 @观察对象 包装纸;它比那更有效。但是 ,从使用角度来看,这就是发生的事情。

        2
  •  0
  •   Asperi    6 年前

    当需要时,我通过参数或构造函数作为绑定传递@State。您可以在我的post代码中找到这种方法的广泛使用 How do I create a multiline TextField in SwiftUI?