【问题标题】:Asynchronously populate/pre-fill multiple, user mutable `@State` values when using SwiftUI?使用 SwiftUI 时异步填充/预填充多个用户可变的“@State”值?
【发布时间】:2019-08-19 21:17:39
【问题描述】:

我有一些带有“.text”值的TextField(s) 应该由“init()”(可以移动)中调用的方法填充,该方法异步调用完成处理程序来自网络的struct 数据。

问题是...用户还可以同时开始手动输入,完成回调不应覆盖手动编辑的值。 p>

我不知道该怎么做:

  1. 更新@State String 变量的值以替换现有值,前提是它们尚未被用户修改...同时让最终用户可以更改它们.
  2. 一次从同一请求更新 N 个 @State 值。一个请求用于提取所有数据,因此映射到单个值同时使其如上文所述那样可变是目前令人头疼的问题。

这似乎是 Combine 的工作,只是还不确定从哪里开始。

【问题讨论】:

    标签: swiftui combine


    【解决方案1】:

    我假设用户编辑是按字段进行的,所有其他字段都应该单独保留。

    将所有状态移动到ObservableObject 中,创建状态变量@Published,从每个状态中获取一个发布者,并从每个状态中创建一个接收器,在每个接收器中设置一个变量if stateX != initialStateXValue { stateXUserModified = true },并拥有一个方法networkUpdate(loadedData:)ObservableObject 上仅在关联的 stateXUserModified 为 false 时设置状态。

    【讨论】:

    • 工作就像一个魅力,谢谢!尽管拥有一个包含这些东西的单一“可变状态”对象有点糟糕。
    • 例如,如果我还想显示一个 Alert,如果出现错误,我必须移动单个 Identifiable var 整个View 也一样,不是吗?
    • 前。 .alert($interactiveState.alertPresentable) { (presentable) -> Alert in /* ... */ } 因为似乎每个 View 中只支持第一个 .alert,至少在 Xcode 11b5 中是这样?
    • 您也可以将整个东西放入一个属性包装器中,这样可以更好地使用和重用。
    • 我没有看到呈现错误和问题之间的联系(根据是否为用户修改修改状态)。我听说使用Text("").hidden().alert 可以显示多个.sheet,但这是另一个问题
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2019-12-26
    • 2019-05-04
    • 2017-07-26
    相关资源
    最近更新 更多